Java内存模型顺序一致性与Leslie Lamport定义不同吗?

时间:2018-08-19 06:23:39

标签: java multithreading java-memory-model jls

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;        

1 个答案:

答案 0 :(得分:2)

我不认为定义不一致。我认为它们(只是)用不同的方式陈述。

但是对于Java内存模型来说,这是没有意义的,因为在JLS 7.4.3末尾有以下注意事项

  

”“如果我们要使用顺序一致性作为我们的内存模型,那么我们讨论的许多编译器和处理器优化都是非法的。例如,在表17.3的跟踪中,一旦将3写入px发生,则需要对该位置进行后续读取才能看到该值。”

换句话说,JMM不使用顺序一致性作为基础。


关于视频中的示例。他在说的是以下内容(我在斜体字中的评论):

  • SC对于程序员来说更容易理解。 他的看法,但可能是真的。
  • 该示例违反了SC。 是的,但是JMM仍然不保证SC。确实,JLS本身有一个“令人惊讶的结果”的例子,这是因为JMM不保证SC!
  • 有人应在JMM中为SC提交JEP。 他们是否应该辩论,但他们当然可以。
  • 实际上很难分析潜在的优化以查看其是否违反了SC。 这也许是JMM不保证SC的充分理由。如果使用SC进行的优化相对于现有JMM进行的优化较少,那么在某些情况下SC可能会使JIT编译的代码变慢。

AFAIK,他从技术角度说的都是有争议的。