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