【发布时间】:2018-08-19 06:23:39
【问题描述】:
JLS-17.4.3 定义每个线程的程序顺序,其中线程程序内的任何重新排序都将保留线程内语义。然后它根据程序顺序定义了顺序一致性。它说顺序一致性是与程序顺序一致的所有动作的总顺序。
现在我有这个问题,程序顺序是按线程定义的,顺序一致性是在所有线程中定义的。这不违反 Leslie Lapmort 定义的顺序一致性吗? -
任何执行的结果都与 如果所有处理器的操作都是 以某种顺序执行,并且操作 每个单独的处理器出现 在这个序列中,按照其指定的顺序 程序。
举个例子,如果编译器重新排序存储和加载查看特定线程的代码(线程的程序顺序)
已编辑:以下部分与来自 youtube 的本次会议有关。
Java Memory Model Pragmatics - 第 48 分钟
第一个示例显示了两个线程的两次执行。每次执行的顺序都保留了线程内语义。下一个示例显示了相同的执行集,但左侧的执行重新排序了 Thread-1 的操作。
现在如果我们只考虑 Thread-1 的程序顺序,重新排序是合法的。但是演示者所说的是它违反了顺序一致性。但是当我阅读 JLS 时,我得到的印象是重新排序的执行是有效的,并且由于有两个合法的程序顺序,因此保持了顺序一致性。我在这方面错了吗?如果是,请您解释一下这种推理有什么问题?
int a=0, int b=0;
Thread - 1 Thread - 2
---------- -----------
r1 = a; b=2;
r2 = b; a=1;
After reordering
int a=0, int b=0;
Thread - 1 Thread - 2
---------- ----------
r2 = b;
b=2;
a=1;
r1 = a;
【问题讨论】:
标签: java multithreading java-memory-model jls