gpt4 book ai didi

java - 如果在构造函数中分配一次,原始变量是否需要是 volatile 的

转载 作者:行者123 更新时间:2023-11-30 07:42:01 25 4
gpt4 key购买 nike

下面的例子中,假设线程A创建了对象X,线程B调用方法getY(),变量y是否需要声明为volatile才能对线程B可见?

public class X{
int y;

public X(){
y=10;
}

public int getY(){
return y;
}
}

最佳答案

Does primitive variable need to be volatile if assigned once in constructor

这是一种解决方案,但还有其他解决方案。

这里可能影响您的情况是y = 10赋值可能不会被刷新,因此第二个线程可能会看到默认的初始值(0 >) 而不是 10

可能的解决方案:

  • y 声明为 final。假设 X 的实例在构造函数结束1之前没有“发布”,JLS 保证其他线程将看到 y 的正确值>.

  • y声明为 volatile 。缺点是,这会在 >>all<< 读取 y 之前添加内存屏障;即对于每个 getY() 调用。

  • 确保线程 A 中 X 构造函数的完成与对 getY 的调用之间存在happens-before链> 在线程 B 中。这可以通过多种方式完成。例如:

    • 通过将 A 中的 X 实例传递给 volatile 变量,
    • 通过使用同步方法调用传递它,或者
    • 让线程 A 在调用 start() 之前向 B 提供共享的 X 实例B 线程。
<小时/>

1 - ...并且您不会使用令人讨厌的反射、不安全或 native 代码来破坏final!

关于java - 如果在构造函数中分配一次,原始变量是否需要是 volatile 的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521094/

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