gpt4 book ai didi

java - 最终字段是否保证字段值在不同线程中可见?

转载 作者:行者123 更新时间:2023-12-04 03:26:13 25 4
gpt4 key购买 nike

我正在使用 JCStress 来测试最终变量。我知道 final 可用于确保当您构造一个对象时,访问该对象的另一个线程不会看到该对象处于部分构造状态。现在我有一个 A.java

public class A {
final int f;

A() {
this.f = 42;
}

}

据我所知,构造函数应该这样执行

A temp = <new>
temp.f = 42
<freeze value>
fv = temp

现在我正在使用下面提到的测试。

@JCStressTest
@State
public class FinalField {
A a;

@Actor
public void writer() {
a = new A();
}

@Actor
public void reader(I_Result result) {
A ta = a;
if (ta != null) {
result.r1 = ta.f;
}
}

}

现在,为什么我在输出中看到值 0?我的 CPU 架构是 x86,所以用负载重新排序存储也没有意义。我得到的输出是

           0    94,922,153     FORBIDDEN  No default case provided, assume FORBIDDEN                  
42 48,638,587 ACCEPTABLE Final value initialized

此外,我发现的另一件事是当我将字段a 声明为static 时。我的输出只有 42,这是为什么?

          42   299,477,390     ACCEPTABLE  Final value initialized      

最佳答案

Now why is it that I see the value 0 in my output ?

a == null(因此 result.r1 仍然是 0)在您的 reader() 中时就是这种情况 方法。

when I declare the field a as static. I get only 42 as my output, and why is that?

您使用 @State 注释了 FinalField,因此 JCStress 会为每次执行创建一个新的 FinalField 实例。
如果 aFinalField 中的实例字段,那么它在每次执行时最初都是 null
如果 aFinalField 中的静态字段,则它在所有执行中共享并且仅在第一次执行时为 null

关于java - 最终字段是否保证字段值在不同线程中可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67553393/

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