基于
易失性会做什么?http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#incorrectlySync
和
易失性http://www.ibm.com/developerworks/library/j-jtp03304/的新保证
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}看起来是这样。
1a) write to non-volatile variable x
1b) write to volatile variable v1a不能通过1b。
我在想,如果我将源代码修改为以下内容
class VolatileExample {
int x = 42;
volatile boolean v = true;
public void writer() {
v = false;
x = 0;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42?????
}
}
}下面的序列可以被置换吗?
2a) write to volatile variable v
2b) write to non-volatile variable x我在想,2b能在2a之前移动吗?这是因为如果2b能够在2a之前移动,读者就不能保证在if块中看到42。
I感到2b可以根据以下信息在2a之前移动。
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering
对易失性字段的写入与监视器释放具有相同的存储效果,而从易失性字段的读取具有与监视器获取相同的存储效果。
这意味着,线程退出同步块之前对线程可见的任何内存操作,在任何线程进入受同一监视器保护的同步块后都是可见的,因为所有内存操作都发生在释放之前,而释放发生在获取之前。
和Roach汽车旅馆与Java内存模型
volatile_v = true; <-- monitor release
non_volatile_x = 42;
(volatile_v will act as a roach motels, and it is fine for non_volatile_x to move into roach motels)
non_volatile_x = 42;
volatile_v = true; <-- monitor release
(volatile_v will act as a roach motels, and it is not OK for non_volatile_x to move out from roach motels)发布于 2011-02-08 00:53:15
我们知道,对易失变量的写入不能相对于以前的任何读或写重新排序(如Java5),但情况并非如此。因此,按照我的理解,将程序重新排序为x= 0;v= false;是正确的。
在我们写到v之后,我们保证当阅读v时,在写v之前发生的每一个动作都是可见的,但是它没有提到写到v之后的任何动作--这些操作可能已经发生,也可能没有发生,甚至可以在v被写入之前被重新排序。
发布于 2011-02-07 09:44:49
有两个部分不稳定,指令的顺序和“冲洗”的写作。
指令的顺序不会改变,但是两段代码之间可能会有任何延迟,所以在第二种情况下,它可能是42,但可能是0。我猜你会经常看到0。
根据您的体系结构,这可能比其他系统更有可能发生,所以在一台机器上测试它,发现它是42,并不意味着它总是在另一台机器上。
发布于 2011-02-07 10:27:21
正如我所理解的新内存模型,一旦一个易失性值被刷新到主内存,所有其他可以被刷新线程看到的变量也必须被刷新。但其结果是,VM不能将2b重新排序到2a之前,因为这将违反代码中隐含的“发生前”顺序。
https://stackoverflow.com/questions/4919392
复制相似问题