我对线程概念还很陌生,并尝试更多地了解它.最近,我发现了一篇关于Jeremy Manson撰写的" Java中的易失手段"的博客文章,他写道:
当一个线程写入一个volatile变量,而另一个线程看到该写入时,第一个线程告诉第二个线程关于内存的所有内容,直到它执行对该volatile变量的写入.[...] 所有的由线程1看到的存储内容,才写信给
[volatile] ready
,必须是可见的主题2,它读取值后true
进行ready
.[自己强调]
现在,这是否意味着在写入volatile变量时,线程1的内存中保存的所有变量(volatile或not)将在读取volatile变量后变为可见?如果是这样,是否可以从官方Java文档/ Oracle源代码中将该语句拼凑起来?从哪个版本的Java开始这个工作?
特别是,如果所有线程共享以下类变量:
private String s = "running";
private volatile boolean b = false;
Run Code Online (Sandbox Code Playgroud)
并且线程1首先执行以下操作:
s = "done";
b = true;
Run Code Online (Sandbox Code Playgroud)
然后线程2执行(在线程1写入volatile字段之后):
boolean flag = b; //read from volatile
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)
这会保证打印"完成"吗?
如果我将写入和读取放入块中而不是声明b
,会发生什么?volatile
synchronized
另外,在题为" 线程之间是否共享静态变量? "的讨论中,@ TREE 写道:
不要使用volatile来保护多个共享状态.
为什么?(对不起;我还没有就其他问题发表评论,或者我会在那里问过......)