Java 只读同步

Java 只读同步,java,concurrency,synchronization,synchronized,Java,Concurrency,Synchronization,Synchronized,有效Java-第66项第2版状态 事实上,除非读写操作都同步,否则同步没有效果 假设我有一个对象,它被一个线程更新,被另一个线程读取。出于通信目的,需要在读取线程上进行同步,因为 换句话说,这些方法上的同步仅用于其通信效果,而不是互斥 但是,如果写入是由单个线程执行的,为什么我们不能在写入过程中不使用Synchronized来进行呢?,因为Java内存模型中以前是如何工作的。要允许thread2查看thread1写入的变量的新值,您需要在此写入和读取之间建立“发生之前”关系。其中一种方法是使用同

有效Java-第66项第2版状态

事实上,除非读写操作都同步,否则同步没有效果

假设我有一个对象,它被一个线程更新,被另一个线程读取。出于通信目的,需要在读取线程上进行同步,因为

换句话说,这些方法上的同步仅用于其通信效果,而不是互斥


但是,如果写入是由单个线程执行的,为什么我们不能在写入过程中不使用Synchronized来进行呢?

,因为Java内存模型中以前是如何工作的。要允许thread2查看thread1写入的变量的新值,您需要在此写入和读取之间建立“发生之前”关系。其中一种方法是使用同步同步块/方法volatile、AtomicXXX,因为释放锁总是发生在获取相同锁之前,对volatile变量的写入发生在后续读取相同volatile变量之前。对于同一变量,AtomicXXX.set发生在AtomicXXX.get之前

所提到的通信是在作者线程和读者线程之间进行的,而不一定是在不同的读者之间进行的。在下面的答案中,这种通信称为“以前发生过”。写入必须在之前发生,否则JVM没有义务使写入可见。