2015-12-30 98 views
3

据我所知,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”。 考虑到这一点,我只是想知道可见性和排序之间的区别/关系是什么?

+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

+0

我想补充一个(因为我只是偶然发现)http://jpbempel.blogspot.fr/2013/05/volatile-and-memory-barriers.html – SubOptimal

+0

谢谢@SubOptimal,你的建议文章很好,在我问这个问题之前,我已经阅读过它们。 – user2351818

回答

1

是的,订购和可视性是相关的问题。

  • 能见度是否/何时一个线程看到的存储器中的结果写入由另一个线程

  • 订货是关于其中更新由第二线程看到的顺序是否匹配(程序)进行第一个线程写入它们的顺序。

Java内存模型不直接解决写入顺序。订单的任何约束(正如你所假设的那样)是可见性规则的结果:这些都是在JLS中指定的。这包括您使用volatile变量有效抑制重新排序的情况。

还值得注意的是,只要JLS内存模型不需要可见性,就可以重新排序写入(从第二个线程的角度来看)。正确的同步将保证同步点的可视性。

相关问题