gpt4 book ai didi

java - Java 内存模型顺序一致性与 Leslie Lamport 定义有何不同?

转载 作者:行者123 更新时间:2023-12-01 14:21:21 25 4
gpt4 key购买 nike

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

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

the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.

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


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

Java Memory Model Pragmatics - 第 48 分钟

第一个示例显示了两个线程的两次执行。每次执行的顺序保留线程内语义。下一个示例显示了同一组执行,但左侧的执行已重新排序它对 Thread-1 的操作。

现在如果我们只考虑 Thread-1 的程序顺序,重新排序是合法的。但是presenter说的是违反了顺序一致性。但是当我阅读 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;

最佳答案

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

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

"If we were to use sequential consistency as our memory model, many of the compiler and processor optimizations that we have discussed would be illegal. For example, in the trace in Table 17.3, as soon as the write of 3 to p.x occurred, subsequent reads of that location would be required to see that value."

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


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

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

据我所知,从技术角度来看,他没有说任何有争议的话。

关于java - Java 内存模型顺序一致性与 Leslie Lamport 定义有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51915064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com