volatile变量的解释

问题描述:

当一个线程读取volatile变量,它看到不仅仅是最新的变化挥发,而且代码的副作用,导致了变化volatile变量的解释

这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提及

有人可以请提供一个这样的例子吗?

这首先给我的印象是,读取volatile变量的线程将与writer线程同步并等待写入完成。但事实并非如此。

一个例子会有很大的帮助,值得赞赏。

感谢, 穆斯塔法

+0

易失字段* do *建立[同步顺序](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.4):“A写入一个易失性变量v(§8.3.1.4)与任何线程的后续v读取进行同步(其中“后续”是根据同步顺序定义的)。但是,这*并不意味着在任意读取之前发生任意写入(该顺序被确定为写入的结果*)。 – user2864740

比方说,你有下面的类:

public class Shared { 
    public int a; 
    public int b; 
    public volatile int c; 
} 

现在,让我们说,线程A拥有这个类的一个实例的引用,确实

shared.a = 1; 
shared.b = 2; 
shared.c = 3; 

我们假设线程B有一个对同一个实例的引用,并且

display(c); 
display(b); 
display(a); 

然后,如果针对c显示的值是3(即,如果线程A的写入发生在线程B的读取之前),那么Java存储器模型保证2和1也分别显示为b和a,这是因为线程A的所有动作都是先前到写入volatile的c被保证可以被读取c的新值的线程看到。

+0

谢谢。声明现在更有意义。现在,我的目的已经达到。 Mush表示赞赏。 – Mustafa