在 Java 中与易失性字段和同步块的关系之前发生 - 以及它们对非易失性变量的影响?
我对线程的概念还很陌生,并试图更多地了解它。最近,我偶然发现了Jeremy Manson的一篇关于Java中Volvel means的博客文章,他写道:
当一个线程写入易失性变量,而另一个线程看到该写入时,第一个线程会告诉第二个线程内存的所有内容,直到它对该易失性变量执行写入。[...]线程 1 看到的所有内存内容,在写入 之前,在读取 的值后,必须对线程 2 可见。[着重号由我自己添加]
[volatile] ready
true
ready
现在,这是否意味着在写入易失性变量时,线程 1 内存中保存的所有变量(无论是否易失性)在读取该易失性变量后对线程 2 可见?如果是这样,是否有可能从官方Java文档/ Oracle来源中将该声明混淆在一起?从哪个版本的Java开始,这将起作用?
特别是,如果所有线程共享以下类变量:
private String s = "running";
private volatile boolean b = false;
线程 1 首先执行以下命令:
s = "done";
b = true;
然后线程 2 在之后执行(在线程 1 写入易失性字段之后):
boolean flag = b; //read from volatile
System.out.println(s);
这能保证打印“完成”吗?
如果我没有将b
声明为易失性
,而是将写入和读取放入同步块中,
会发生什么情况?
此外,在标题为“静态变量是否在线程之间共享?”的讨论中,@TREE写道:
不要使用易失性来保护多个共享状态。
为什么?(对不起;我还不能评论其他问题,否则我会在那里问...)