1 回答

TA贡献1828条经验 获得超3个赞
为了弄清楚提供了哪些可见性保证,您需要更好地理解 Java 内存模型,更具体地说,在 JMM 的上下文中 happens-before 意味着什么。JMM 将发生的事情描述为actions,例如,正常的读写、volatile 读写、锁定、解锁等。
JMM 中有一些规则确定一个动作何时先于另一个动作发生。与您的情况相关的规则如下:
单线程规则:在给定线程中,如果 A 在程序顺序中先于 B,则操作 A 发生在操作 B 之前。
监视器锁定规则(同步):给定监视器的解锁发生在同一监视器上的后续锁定之前。
重要的是要知道happens-before是传递性的,即如果 hb(a, b) 和 hb(b, c),则 hb(a, c)。
在您的示例中,一个线程在退出时释放监视器syncronizedMethodA()
,而另一个线程随后在进入时获取监视器syncronizedMethodB()
。那是一种先发生后关系。由于 HB 是可传递的,因此执行的操作syncronizedMethodA()
对于随后进入的任何线程都是可见的syncronizedMethodB()
。
另一方面,在释放监视器syncronizedMethodA()
和由另一个线程执行的后续操作之间不存在先行关系notSynchronizedMethod()
。因此,无法保证写入syncronizedMethodA()
对另一个线程的读取可见notSynchronizedMethod()
。
添加回答
举报