考虑以下课程:
public myClass {
int a;
Object obj; //This object is not of class myClass nor of a subclass of it.
void foo(int b){
synchronized(this){
print(a);
a = b;
obj.value = b;
obj.bar();
}
}
void bar(){
synchronized(this){
//Some code using obj here.
}
}
}
Java文档声明:
当线程释放内部锁时,在该操作与同一锁的任何后续获取之间建立先发生关系。
假设两个线程T1,T2和myClass的一个对象叫做myclass。
现在T1调用foo,在T2调用bar之后不久,最终获得锁定并进入bar()。纠正我,如果错了,但据我所知,T2看到对T1.foo(b)变量a的变化。如何对obj进行更改?认为这是一个任意的其他对象。
是否保证了以前发生过的关系?
答案 0 :(得分:2)
是:T2获取T1释放的锁定。因此,存在之前的关系,并且在释放锁之前由T1完成的写入因此在获得锁之后由T2可见。
见http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility。
请注意,它是关于内存操作,例如共享变量的读取和写入。不仅读取和写入被用作锁的对象的字段。