只读同步
Read only synchronization
有效 Java - 项目 66(第 2 版)状态
In fact, synchronization has no effect unless both read and write operations are synchronized.
假设我有一个对象正在被一个线程更新并被另一个线程读取。出于通信目的,需要在读取线程上进行同步,因为如前所述
In other words, the synchronization on these methods is used solely for its communication effects, not for mutual exclusion.
但是如果写入是由单线程执行的,为什么我们在写入期间不使用同步就不能逃脱呢?
由于 happens-before 在 Java 内存模型中的工作方式。要允许线程 2 看到线程 1 写入的变量的新值,您需要在该写入和读取 (https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html) 之间建立 happens-before 关系。其中一种方法是使用同步 (synchronized
blocks/methods, volatile
, AtomicXXX
) 因为释放锁总是发生在获取同一个锁之前,写入volatile
变量发生在后续读取同一 volatile
变量之前。并且 AtomicXXX.set()
发生在 AtomicXXX.get()
之前对于同一个变量。
有效 Java - 项目 66(第 2 版)状态
In fact, synchronization has no effect unless both read and write operations are synchronized.
假设我有一个对象正在被一个线程更新并被另一个线程读取。出于通信目的,需要在读取线程上进行同步,因为如前所述
In other words, the synchronization on these methods is used solely for its communication effects, not for mutual exclusion.
但是如果写入是由单线程执行的,为什么我们在写入期间不使用同步就不能逃脱呢?
由于 happens-before 在 Java 内存模型中的工作方式。要允许线程 2 看到线程 1 写入的变量的新值,您需要在该写入和读取 (https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html) 之间建立 happens-before 关系。其中一种方法是使用同步 (synchronized
blocks/methods, volatile
, AtomicXXX
) 因为释放锁总是发生在获取同一个锁之前,写入volatile
变量发生在后续读取同一 volatile
变量之前。并且 AtomicXXX.set()
发生在 AtomicXXX.get()
之前对于同一个变量。