对"Concurrency in Practice"的评论


@ThreadSafe
public class SynchronizedInteger {
    @GuardedBy("this") private int value;
    public synchronized int get() { return value; }
    public synchronized void set(int value) { this.value = value; }
}

书中说:

考虑易失变量的一个好方法是想象它们的行为大致类似于 SyncdInteger 类 在示例 3.3 中,将易失变量的读写替换为对 get 和 set 的调用。
...
这个类比并不准确;SyncdInteger 的内存可见性效果实际上略强于易失变量。看 第16章.

我检查了第 16 章,但没有找到确切的答案 - 内存可见性保证究竟如何更强?

主要区别在于,volatile在写入volatile变量和从中读取的子请求之间创建先发生前关系,而synchronized在解锁和后续锁之间创建发生前关系。

因此,在SynchronizedInteger发生的情况下,在任何后续操作与SychrozniedInteger之间创建关系之前(即 get()set()调用(,它们是读取还是写入都无关紧要。它不同于仅在写入和后续读取之间提供发生之前volatile int的行为。

实际上,

我想不出任何有意义的例子来说明这种差异,因此这些行为实际上只是略有不同。

最新更新