JLS-17.4.3定义每个线程的程序顺序,其中程序中对该线程的任何重新排序都将保留线程内语义。然后根据程序顺序定义顺序一致性。它说顺序一致性是与程序顺序一致的所有 Action 的总顺序。
现在,我有一个问题,即在每个线程中定义程序顺序,并在所有线程中定义顺序一致性。这是否违反了Leslie Lapmort定义的顺序一致性? --
例如,如果编译器重新排序存储并加载特定线程的代码(线程的程序顺序),该怎么办?
编辑:以下部分与来自youtube的本次 session 有关。
Java Memory Model Pragmatics-第48分钟
第一个示例显示了两个线程的两次执行。每次执行的顺序保留了线程内语义。下一个示例显示了相同的执行集,但是左侧的执行将其对Thread-1的操作重新排序。
现在,如果我们仅考虑线程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内存模型是没有意义的,因为JLS 7.4.3末尾的以下警告
换句话说,JMM不使用顺序一致性作为其基础。
关于视频中的示例。他的意思是(我的斜体字):
AFAIK,他从技术角度说的都是有争议的。