gpt4 book ai didi

Java内存模型: volatile variables and happens-before

转载 作者:IT老高 更新时间:2023-10-28 20:52:05 25 4
gpt4 key购买 nike

我想澄清 happens-before 关系如何与 volatile 变量一起工作。让我们有以下变量:

public static int i, iDst, vDst;
public static volatile int v;

和线程 A:

i = 1;
v = 2;

和线程 B:

vDst = v;
iDst = i;

根据 Java 内存模型 (JMM),以下陈述是否正确?如果不正确,正确的解释是什么?

  • i = 1 总是发生之前 v = 2
  • v = 2 happens-before vDst = v 在 JMM 中,仅当它实际上发生在时间之前
  • i = 1 happens-before iDst = i 在 JMM 中(并且 iDst 将被可预测地分配 1) 如果 v = 2 实际上发生在 vDst = v 之前
  • i = 1iDst = i 之间的其他顺序未定义,iDst 的结果值也未定义

逻辑错误:

JMM 中没有“挂钟时间”的概念,我们应该依赖 同步顺序 作为 v = 2vDst = 的排序指南v。有关详细信息,请参阅所选答案。

最佳答案

  • i = 1 总是发生之前 v = 2

没错。由 JLS 部分 17.4.5 ,

If x and y are actions of the same thread and x comes before y in program order, then hb(x, y).


  • v = 2 happens-before vDst = v 在 JMM 中,仅当它实际上发生在时间之前
  • i = 1 happens-before iDst = i 在 JMM 中(并且 iDst 将被可预测地分配 1) 如果 v = 2 实际上发生在 vDst = v 之前

错误。发生之前的顺序并不能保证在物理时间之前发生的事情。来自 JLS 的同一部分,

It should be noted that the presence of a happens-before relationship between two actions does not necessarily imply that they have to take place in that order in an implementation. If the reordering produces results consistent with a legal execution, it is not illegal.

但是,保证 v = 2 happens-before vDst = vi = 1 happens-before iDst = i 如果在同步顺序中 v = 2vDst = v 之前,a经常被误认为实时顺序的执行的同步操作的总顺序。


  • i = 1iDst = i 之间的其他顺序未定义,iDst 的结果值也未定义

如果 vDst = v 在同步顺序中出现在 v = 2 之前就是这种情况,但实际时间并没有计算在内。

关于Java内存模型: volatile variables and happens-before,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246007/

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