评论“实践中的并发”

时间:2011-08-31 13:11:28

标签: java multithreading concurrency

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

1 个答案:

答案 0 :(得分:5)

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

因此,如果发生SynchronizedInteger,则在使用SychrozniedInteger(即get()set()调用)的任何后续操作之间创建关系之前,并且它不会无论是读还是写。它不同于volatile int提供的行为 - 仅在写入和后续读取之间发生。

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

相关问题