Java多线程编程核心技术-读书笔记20220626

77 阅读2分钟

2.1synchronized同步方法

“非线程安全”其实会在多个线程同时对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是渠道的数据其实是被更改过的。

而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。

2.1.1方法内的变量为线程安全

“非线程安全”问题在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”了。

方法中的变量不存在非线程安全,永远是线程安全的,这是由于方法内部的变量是私有的特性造成的。

2.1.2实例变量非线程安全

如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。

用线程访问的对象中如果有多个实例变量,则运行的结果有可能出现交叉的情况。

如果对象仅有1个实例变量,则有可能出现覆盖的情况。

在两个线程访问同一个对象中的同步方法时一定是线程安全的。

2.1.3多个对象多个锁

如果多个线程访问多个对象,则JVM会创建多个锁。

同步单词为synchronized的,异步单词为asynchronized。

2.1.4synchronize方法与锁的对象

调用关键字synchronized声明的方法一定是排队运行的。另外需要牢记“共享”,只有共享资源的读写访问才需要同步化,如果不是共享资源,那么根本没有同步的必要。

A线程先持有Object对象的Lock锁,B线程可以以异步的方式调用Object对象中的非synchronized类型的方法。

A线程先持有Object对象的Lock锁,B线程如果在这个时候调用Object对象中的synchronized类型的方法则需要等待,也就是同步。

2.1.5脏读

在对对象取值时如果不进行同步操作,也会存在脏读的情况(dirtyRead)。

脏读一定会出现在操作实例变量的情况下,这就是不同线程“争抢”实例变量的结果。