JLS-17.4.3定义了每个线程的程序顺序,其中线程内程序的任何重新排序都将保留线程内语义。然后它根据程序顺序定义了顺序一致性。它说,顺序一致性是与程序顺序一致的所有操作的总顺序。
现在我有一个问题,程序顺序是针对每个线程定义的,而顺序一致性是跨所有线程定义的。这是否违反了Leslie Lapmort定义的顺序一致性?-
任何执行的结果都与如果所有处理器的操作按某个顺序执行相同,并且每个单独处理器的操作在此序列中按其程序指定的顺序出现。
例如,如果编译器查看特定线程的代码(线程的程序顺序),重新排序存储和加载会怎样?
编辑:以下部分涉及来自youtube的此会话。
Java内存模型实用性 - 第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;