【问题标题】:Read only synchronization只读同步
【发布时间】:2018-03-13 19:42:27
【问题描述】:

Effective Java - Item 66 (2nd Edition) 状态

实际上,除非读写操作都同步,否则同步是没有效果的。

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

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

但是如果写入是由单线程执行的,为什么我们在写入过程中不使用同步就不能逃脱呢?

【问题讨论】:

  • 这里提到的通信是在写线程和读线程之间,而不是(必须)在不同的读者之间。在下面的答案中,这种通信称为happens-before。写入必须先发生,否则 JVM 没有义务使写入可见。

标签: java concurrency synchronization synchronized


【解决方案1】:

因为 happens-before 在 Java 内存模型中的工作方式。要让 thread2 看到 thread1 写入的变量的新值,您需要在此写入和读取之间建立 happens-before 关系 (https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html)。其中一种方法是使用同步(synchronized 块/方法,volatileAtomicXXX),因为释放锁总是发生在获取相同锁之前,写入volatile 变量发生在后续读取之前相同的volatile 变量。对于同一个变量,AtomicXXX.set() 发生在 AtomicXXX.get() 之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多