评论"实践中的并发"

ata*_*mur 1 java concurrency multithreading

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

这本书说:

考虑volatile变量的好方法是想象它们的行为大致类似于清单3.3中的SynchronizedInteger类,用get和set调用替换volatile变量的读写.
......
这个比喻并不准确; SynchronizedInteger的内存可见性效果实际上比volatile变量略强.见第16章.

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

axt*_*avt 5

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

因此,在的情况下,SynchronizedInteger之前发生的关系与任何后续操作之间产生SychrozniedInteger(即get()set()电话),并不要紧,他们是否读取或写入.它与提供的行为不同volatile int- 仅在写入和后续读取之间发生.

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