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不使用顺序一致性作为其基础。

关于视频中的示例。他的意思是(我的斜体字):

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

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

    09-27 00:34
    查看更多