【发布时间】:2013-06-11 02:32:47
【问题描述】:
我对线程的概念仍然很陌生,并尝试更多地了解它。最近,我在 What Volatile Means in Java 上看到了 Jeremy Manson 的一篇博文,他写道:
当一个线程写入一个 volatile 变量,而另一个线程看到 那篇文章,第一个线程告诉第二个线程关于 all 内存的内容,直到它执行对该易失性的写入 多变的。 [...] 所有线程 1 看到的内存内容,之前 它写给
[volatile] ready,在它之后必须对线程2可见 为ready读取值true。 [重点由我自己补充]
现在,这是否意味着在写入 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 块中,会发生什么情况?
另外,在题为“Are static variables shared between threads?”的讨论中,@TREE writes:
不要使用 volatile 来保护多个共享状态。
为什么?(抱歉;我还不能对其他问题发表评论,否则我会在那里问...)
【问题讨论】:
标签: java multithreading synchronized volatile