在Java中使用volatile字段和synchronized块的先于关系 - 以及它们对非volatile变量的影响?

24 浏览
0 Comments

在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来保护多个共享状态。

为什么?(抱歉,我还不能在其他问题上评论,否则我会在那里提问的...)

0