我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