在Java中使用volatile字段和synchronized块的先于关系 - 以及它们对非volatile变量的影响?
- 论坛
- 在Java中使用volatile字段和synchronized块的先于关系 - 以及它们对非volatile变量的影响?
24 浏览
在Java中使用volatile字段和synchronized块的先于关系 - 以及它们对非volatile变量的影响?
我对线程的概念还不太熟悉,正在努力了解更多相关知识。最近,我看到了Jeremy Manson在他的博客文章《Java中的volatile是什么意思》中写道:
当一个线程写入一个volatile变量,并且另一个线程看到这个写操作时,第一个线程向第二个线程传达了自己在写入该volatile变量之前的所有内存内容。[...] 线程1写入
[volatile] ready
后,线程2读取ready
的值为true
时,必须能看到线程1在写入之前的所有内存内容。[由我添加的强调部分]
那么,这是否意味着在写入volatile变量时,Thread 1的内存中的所有变量(无论是否是volatile)都会在Thread 2读取该volatile变量后变得可见?如果是这样的话,是否可以从官方的Java文档/Oracle来源中解释这个陈述?从哪个版本的Java开始可以实现这个效果?
特别是,如果所有线程共享以下的类变量:
private String s = "running"; private volatile boolean b = false;
并且Thread 1首先执行以下操作:
s = "done"; b = true;
然后Thread 2在其后执行(在Thread 1写入volatile字段之后):
boolean flag = b; //从volatile读取 System.out.println(s);
这将保证输出"done"吗?
如果我将写入和读取操作放入一个synchronized块中,会发生什么?
此外,在一个名为"静态变量在线程之间共享吗?"的讨论中,@TREE 写道:
不要使用volatile来保护多个共享状态。
为什么?(抱歉,我还不能在其他问题上评论,否则我会在那里提问的...)