评论

2011-08-31 146 views
1
@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章,但没有找到确切的答案 - 内存可见性保证如何更强?

+3

建议您改述此事。让它成为一个独立的问题。稍后在实践中添加对实践的参考,以显示您对答案感兴趣的原因。 –

回答

5

的主要区别在于,volatile创建之前发生到volatile可变写入和从中读取一个subsequest之间的关系,而​​创建一个解锁和随后的锁定之间之前发生的关系。

所以,在任何后续操作之间有SychrozniedInteger(即get()set()电话)创造的SynchronizedInteger情况之前发生关系,没关系无论是读取或写入。它不同于volatile int提供的行为 - 仅在写入和随后的读取之间。

其实我无法想象任何有意义的例子来说明这种差异,所以这些行为真的只是稍有不同。