【发布时间】:2020-01-24 12:37:16
【问题描述】:
我正在阅读 Java Concurrency in Practice,在“16.1.3 The Java Memory Model in 500 words or less”中,它说:
Java 内存模型是根据操作指定的,包括对变量的读取和写入、监视器的锁定和解锁,以及启动和加入线程。 JMM 为程序内的所有动作定义了一个名为happens-before 的部分排序。 以保证执行动作 B 的线程可以看到动作 A 的结果(无论是否A 和 B 发生在不同的线程中),则 A 和 B 之间必须存在happens-before 关系。在两个操作之间没有happens-before 排序的情况下,JVM 可以随意对它们进行重新排序。
即使动作只是部分排序的,同步动作——锁的获取和释放,以及 volatile 变量的读取和写入——是完全排序的。用“后续”锁定获取和 volatile 变量读取来描述发生前发生。
关于“偏序”,我找到了this和this,但是我不太明白“虽然动作只是偏序,但同步动作——锁的获取和释放,读取和volatile 变量的写入——完全有序。”。 “同步动作是完全有序的”是什么意思?
【问题讨论】:
-
部分排序,A必须在B之前:
ACDB。总订购量:ABCD -
@Michael 我还是不明白同步动作和总排序是什么关系,能举个例子吗?
-
您阅读了本章的其余部分吗?我不记得内容的具体细节,但您似乎是在说您不理解什么是故意的 tl;dr 摘要,而没有阅读随后的 16 页解释。
-
问题中列出了确切的同步操作。 JVM 不能对它们重新排序——它们必须在你的代码中的另一个中执行。你到底有什么不明白的地方?
-
@Michael 不,我没有,我会阅读重置。
标签: java multithreading happens-before