【问题标题】:Is Java Memory Model Sequential Consistency different from Leslie Lamport Definition?Java 内存模型顺序一致性与 Leslie Lamport 定义不同吗?
【发布时间】:2018-08-19 06:23:39
【问题描述】:

JLS-17.4.3 定义每个线程的程序顺序,其中线程程序内的任何重新排序都将保留线程内语义。然后它根据程序顺序定义了顺序一致性。它说顺序一致性是与程序顺序一致的所有动作的总顺序。

现在我有这个问题,程序顺序是按线程定义的,顺序一致性是在所有线程中定义的。这不违反 Leslie Lapmort 定义的顺序一致性吗? -

任何执行的结果都与 如果所有处理器的操作都是 以某种顺序执行,并且操作 每个单独的处理器出现 在这个序列中,按照其指定的顺序 程序。

举个例子,如果编译器重新排序存储和加载查看特定线程的代码(线程的程序顺序)


已编辑:以下部分与来自 youtube 的本次会议有关。

Java Memory Model Pragmatics - 第 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;        

【问题讨论】:

    标签: java multithreading java-memory-model jls


    【解决方案1】:

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

    但这对于 Java 内存模型来说没有实际意义,因为 JLS 7.4.3 末尾有以下警告

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

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


    关于视频中的那个例子。他说的是以下内容(我的cmets用斜体):

    • SC 对程序员来说更容易理解。 他的观点,但可能是真的。
    • 该示例违反了 SC。 是的,但 JMM 并不保证 SC。事实上,JLS 本身就有一个“令人惊讶的结果”的例子,这是由于 JMM 不保证 SC!
    • 应有人在 JMM 中为 SC 提交 JEP。 他们是否应该有争议,但他们当然可以。
    • 实际上分析潜在的优化以查看它们是否违反 SC 是很困难的。 这可能是 JMM 不保证 SC 的一个很好的理由。如果与现有 JMM 相比,SC 的优化较少,那么 SC 在某些情况下可能会使 JIT 编译的代码变慢。

    AFAIK,从技术角度来看,他没有说任何有争议的内容。

    【讨论】:

    • 警告 - 我可能对一致性问题有误。但是如果你认为我错了,请写下你自己的答案来解释(具体地)不一致的性质。
    • Stephen,我可以请您观看此视频中的这一点,并征求您的意见。作者谈到了违反顺序一致性的问题。我也会用它更新问题。 youtu.be/TxqsKzxyySo?list=PL2DAEF8634BDD9CF7&t=2883
    • 斯蒂芬,这个例子怎么违反了SC? JLS 说“如果所有动作都以与程序顺序一致的总顺序(执行顺序)发生,则一组动作是顺序一致的”。但是程序顺序是按线程定义的,不是吗?那么为什么重新排序一次执行会违反 SC 呢?我的意思是,如果我们只考虑 Thread-1 的执行,重新排序是合法的,不是吗?或者通过程序顺序,JLS 真的暗示了代码中的动作顺序吗?
    • @psaw.mora 或者通过程序顺序,JLS 是否真的暗示了代码中的动作顺序?是的。 JLS 说:如果所有动作都以与程序顺序一致的总顺序(执行顺序)发生,则一组动作是顺序一致的...但是请注意,破坏顺序一致性是绝对正常的对于 JVM,因为从未说过它以这种方式运行。
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    相关资源
    最近更新 更多