不知写volatile变量将迫使JVM所有非volatile变量同步到内存中,因此,例如,将下面的代码会发生什么:写入volatile变量后会发生什么?
volatile int x;
int y;
y=5;
x=10;
x将被写入到存储器,但是y会发生什么?它会被写入内存吗?
不知写volatile变量将迫使JVM所有非volatile变量同步到内存中,因此,例如,将下面的代码会发生什么:写入volatile变量后会发生什么?
volatile int x;
int y;
y=5;
x=10;
x将被写入到存储器,但是y会发生什么?它会被写入内存吗?
是的,在the Java Language Specification (third edition) -- in particular section 17.4.4的规则下 - 如果看到新值x
的每个线程都会随后看到新值y
,如果他们试图读取它。不读取x
的线程不保证会受到影响。
但是,请注意,此保证不存在于JLS的第二版版本的内存模型中。在那里,易失性读取和写入对非易失性存储器访问的排序没有影响。
对于所有无法将语言版本的版本映射到实际Java版本的人员:这意味着Henning所描述的从Java 1.5开始就是真实的; ) – Voo
y没有声明为volatile ...? –
不,有意故意将其声明为不稳定。问题是如果写入volatile变量意味着所有变量的内存屏障。 – Anonymice
我认为这将取决于您的Java版本... –