只读同步

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() 之前对于同一个变量。