据我所知,可见性(Visibility)涉及一个线程在什么条件下能够观察到/看到另一个线程对共享变量的更新。即使是单处理器系统也可能遇到可见性问题。
而顺序性(Ordering)则涉及一个线程按照什么顺序看到另一个CPU中运行的内存操作。单处理器系统不会遇到顺序性问题。
但有时候,所谓的顺序性问题可以用可见性的概念来解释。
如果上面程序的输出为"0"(而不是"1"), 我们可以说这是一个顺序问题(即重新排序)---写入到ready似乎在写入到data之前发生。 然而,我认为我们也可以将这个输出解释为可见性的结果:Thread2首先看到了Thread1对ready的更新,然后是data,可能是由于存储缓冲区刷新到CPU缓存所致。如果print(data)在Thread2看到data更新之前执行,那么我们就得到了输出"0"。 考虑到这一点,我只想知道可见性和顺序之间的区别/关系是什么?
//Thread1 runs
int data;
boolean ready;
void method1(){
data=1;
ready=true;
}
//Thread2 runs
void method2(){
if(ready){
System.out.print(data);
}
}
如果上面程序的输出为"0"(而不是"1"), 我们可以说这是一个顺序问题(即重新排序)---写入到ready似乎在写入到data之前发生。 然而,我认为我们也可以将这个输出解释为可见性的结果:Thread2首先看到了Thread1对ready的更新,然后是data,可能是由于存储缓冲区刷新到CPU缓存所致。如果print(data)在Thread2看到data更新之前执行,那么我们就得到了输出"0"。 考虑到这一点,我只想知道可见性和顺序之间的区别/关系是什么?