gpt4 book ai didi

java - 将字段设置为 `volatile` 是否可以防止并发情况下的所有内存可见性问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:31 25 4
gpt4 key购买 nike

使类字段 volatile 是否可以防止并发情况下的所有内存可见性问题?对于下面的类,获取 Test 对象引用的线程是否有可能首先将 x 视为 0(int 的默认值) 然后 10 ?我认为这是可能的当且仅当Test 的构造函数在未完成(不正确的发布)的情况下放弃了this 引用。有人可以验证/纠正我吗?

class Test {
volatile int x = 10;
}

第二个问题:如果是 final int x=10; 怎么办?

最佳答案

根据 JMM,您实际上不能保证看到 x = 10。

例如,如果你有

Test test =  null;

Thread 1 -> test = new Test();
Thread 2 -> test.x == // even though test != null, x can be seen as 0 if the
// write of x hasn't yet occur

现在如果你有

class Test{
int y = 3;
volatile x = 10;
}

如果线程 2 读取 x == 10 线程 2 保证读取 y == 3

回答你的第二个问题。

拥有 final 字段将在构造函数之后和发布之前发布一个 storestore,因此拥有 final 字段实际上将确保您看到 x = 10。

编辑:正如 yshavit 指出的那样。你失去了我在我的第一个例子中提到的 final 字段的 happens-before 关系,就像 yshavit 所说的那样,如果线程 2 读取 x == 10 它可能不会读取 y == 3,其中 x 是一个 final 字段。

关于java - 将字段设置为 `volatile` 是否可以防止并发情况下的所有内存可见性问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764922/

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