考虑下面的类:
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 文档指出:
When a thread releases an intrinsic lock, a happens-before relationship is established between that action and any subsequent acquisition of the same lock.
假设有两个线程 T1、T2 和一个名为 myclass 的 myClass 对象。
现在T1调用foo,不久之后T2调用bar并最终获得锁并进入bar()。如果错误请纠正我,但据我了解,T2 看到了 T1.foo(b) 对变量 a 所做的更改。对 obj 进行的更改怎么样?将此视为任意其他对象。
是否保证存在先发生的关系?
最佳答案
是:T2 获取了 T1 已释放的锁。因此存在一个发生之前的关系,并且 T1 在释放锁之前完成的写入因此在 T2 获取锁后可以被 T2 看到。
参见http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility 。
请注意,它是关于内存操作,例如共享变量的读写。不仅可以读取和写入用作锁的对象的字段。
关于java - 理解发生在关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44736560/