@ThreadSafe
public class SynchronizedInteger {
@GuardedBy("this") private int value;
public synchronized int get() { return value; }
public synchronized void set(int value) { this.value = value; }
}
这本书说:
考虑volatile变量的好方法是想象它们的行为大致类似于SynchronizedInteger类 在代码清单3.3中,通过调用get和set来替换volatile变量的读写 ...
这个比喻并不准确; SynchronizedInteger的内存可见性效果实际上比volatile变量略强。看到 第16章。
我检查了第16章,但没有找到确切的答案 - 内存可见性保证的确切程度如何更强?
答案 0 :(得分:5)
主要区别在于volatile
创建了对volatile
变量的写入与从中读取的子请求之间的先发生关系,而synchronized
创建了之前的关系。解锁并随后锁定。
因此,如果发生SynchronizedInteger
,则在使用SychrozniedInteger
(即get()
和set()
调用)的任何后续操作之间创建关系之前,并且它不会无论是读还是写。它不同于volatile int
提供的行为 - 仅在写入和后续读取之间发生。
实际上我无法想象任何有意义的例子来说明这种差异,所以这些行为确实只是略有不同。