据我所知,Visibility处理线程在什么条件下可以观察/看到另一个线程对共享变量的更新。 即使是单处理器系统也会遇到可见性问题。 Ordering以什么顺序处理线程看到另一个CPU中另一个运行执行的内存操作。 单处理器系统不会受到订购问题的影响。 但是,我觉得有时所谓的订购问题可以用可见性的概念来解释,例如。
//Thread1 runs
int data;
boolean ready;
void method1(){
data=1;
ready=true;
}
//Thread2 runs
void method2(){
if(ready){
System.out.print(data);
}
}
如果上述程序的输出是" 0"(而不是" 1"),我们可以说有一个Ordering问题(即重新排序)---写在写入数据之前, ready 出现。 但是,我认为我们也可以将此输出解释为Visibility的结果:Thread2首先看到Thread1更新为 ready ,然后是 data ,可能是由于Store Buffer刷新到CPU缓存,如果在Thread2看到更新到数据之前执行了打印(数据),那么我们得到输出" 0"。 考虑到这一点,我只是想知道可见性和订购之间的区别/关系是什么?
答案 0 :(得分:1)
是的,订购和可见性是相关问题。
可见性是关于一个线程是否/何时看到另一个线程执行的内存写入的结果
排序是关于第二个线程看到更新的顺序是否与第一个线程写入它们的(程序)顺序相匹配。
Java内存模型不直接解决写入顺序。订单的任何约束都是(如您所假设的)可见性规则的结果:这些约束在JLS中指定。这包括使用volatile
变量来有效抑制重新排序的情况。
值得注意的是,只要JLS内存模型不需要可见性,就可以发生写入的重新排序(从第二个线程的角度来看)。正确的同步将保证同步点的可见性。