JLS-17.4.3定义每个线程的程序顺序,其中程序中对该线程的任何重新排序都将保留线程内语义。然后根据程序顺序定义顺序一致性。它说顺序一致性是与程序顺序一致的所有动作的总顺序。
现在我有一个问题,即在每个线程中定义程序顺序,并在所有线程中定义顺序一致性。这是否违反了Leslie Lapmort定义的顺序一致性? -
任何执行的结果与 如果所有处理器的操作都 以一定顺序执行,并且操作 每个处理器的出现 按照其指定的顺序 程序。
例如,如果编译器重新排序存储和加载,并查看特定线程的代码(线程的程序顺序),会怎样?
已编辑:以下部分与来自youtube的本次会议有关。
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;
答案 0 :(得分:2)
我不认为定义不一致。我认为它们(只是)用不同的方式陈述。
但是对于Java内存模型来说,这是没有意义的,因为在JLS 7.4.3末尾有以下注意事项
”“如果我们要使用顺序一致性作为我们的内存模型,那么我们讨论的许多编译器和处理器优化都是非法的。例如,在表17.3的跟踪中,一旦将3写入px发生,则需要对该位置进行后续读取才能看到该值。”
换句话说,JMM不使用顺序一致性作为基础。
关于视频中的示例。他在说的是以下内容(我在斜体字中的评论):
AFAIK,他从技术角度说的都是有争议的。