据我所知,Visibility可以处理线程观察/查看另一个线程更新共享变量的条件。 即使是单处理器系统也可能遭受可见性问题。 Ordering处理线程看到另一个CPU中另一次运行所执行的内存操作的顺序。 单处理器系统不会遭受订购问题。 但是,我觉得有时所谓的Ordering问题可以用可见性的概念来解释,例如,g。可见性和排序之间的关系/区别是什么?
//Thread1 runs
int data;
boolean ready;
void method1(){
data=1;
ready=true;
}
//Thread2 runs
void method2(){
if(ready){
System.out.print(data);
}
}
如果上述程序的输出为“0”(而不是“1”),我们可以说,有一个排序的问题(即重新排序)---在写准备出现在写入数据之前发生。然而,我认为我们也可以将这个输出解释为可见性的结果:Thread2首先看到更新到已准备好 by Thread1,然后数据,可能是因为Store Buffer刷新到CPU Cache,并且如果打印数据)在Thread2看到更新为数据之前执行,然后我们得到输出“0”。 考虑到这一点,我只是想知道可见性和排序之间的区别/关系是什么?
看看Doug Lea关于[同步和Java内存模型](http://gee.cs.oswego.edu/dl/cpj/jmm.html)的这篇文章。这是关于原子性,可见性和各种排序的一个很好的概述,可能会与您期望的不同。这是来自同一作者的另一篇关于[JSR-133 - Java内存模型](http://gee.cs.oswego.edu/dl/jmm/cookbook.html)的文章。 – SubOptimal
我想补充一个(因为我只是偶然发现)http://jpbempel.blogspot.fr/2013/05/volatile-and-memory-barriers.html – SubOptimal
谢谢@SubOptimal,你的建议文章很好,在我问这个问题之前,我已经阅读过它们。 – user2351818