gpt4 book ai didi

java - Java 内存模型是否保证线程内写入的可见性?

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:04 24 4
gpt4 key购买 nike

考虑一个简单的单线程 Java 程序执行,不涉及同步操作,只涉及实例变量的普通读取和写入。简单地忽略所有写入 的实现似乎符合 Java 内存规范。首先,来自 §17.4 的适用一般性声明:

The memory model determines what values can be read at every point in the program. The actions of each thread in isolation must behave as governed by the semantics of that thread, with the exception that the values seen by each read are determined by the memory model.

相关约束如下(§17.4.5):

1。 happens-before 由程序顺序引起的排序:

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

2。 happens-before 一致性:

A set of actions A is happens-before consistent if for all reads r in A, where W(r) is the write action seen by r, it is not the case that either hb(r, W(r)) or that there exists a write w in A such that w.v = r.v and hb(W(r), w) and hb(w, r).

这基本上排除了它观察到的写入发生在之前的读取。另一项规定只是一个完整性条款,它防止读取某些 v 时看到较早写入的那个 v ,同时紧随其后的是另一次写入相同的 v.

我找不到任何保证一定会积极观察写入的保证,只能对可能不会观察到的写入进行限制。

我在这里错过了什么? JVM 真的有可能遗漏这种微不足道的保证吗?

最佳答案

让我们使用:

class MyClass {
private static int i = 0;

public static void main(String[] args) {
i = 3; //w
System.out.println(i); //r
}
}
  • 当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。
  • 如果程序正确同步,则该程序的所有执行看起来都是顺序一致的(§17.4.3)。
  • 当一个程序包含两个冲突的访问(§17.4.1)且未按发生前关系排序时,我们称它包含数据竞争。

    你的程序是单线程的
    => 我们从程序顺序约束中得到 hb(w,r)
    => 已正确同步
    => 程序的所有执行看起来都是顺序一致的。
    => 它将打印 3

关于java - Java 内存模型是否保证线程内写入的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175254/

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