volatile变量的解释
问题描述:
当一个线程读取volatile变量,它看到不仅仅是最新的变化挥发,而且代码的副作用,导致了变化volatile变量的解释
这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提及
有人可以请提供一个这样的例子吗?
这首先给我的印象是,读取volatile变量的线程将与writer线程同步并等待写入完成。但事实并非如此。
一个例子会有很大的帮助,值得赞赏。
感谢, 穆斯塔法
答
比方说,你有下面的类:
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
易失字段* 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