gpt4 book ai didi

Java 内存模型和最终字段

转载 作者:行者123 更新时间:2023-11-29 10:02:28 25 4
gpt4 key购买 nike

<分区>

最近,当我向 JMM 寻求与“最终”相关的保证时,我感到很困惑。这是 JMM 的摘录和示例

图 4 给出了一个示例,演示了最终字段与普通字段的比较。类FinalFieldExample 有一个 final int 字段 x 和一个非 final int 字段 y。一个线程可能执行 writer() 方法,而另一个线程可能执行 reader() 方法。因为 writer() 写 f在对象的构造函数完成后,reader() 将保证看到 f.x 的正确初始化值:它将读取值 3。但是,f.y 不是最终的;因此,不能保证 reader() 方法看到它的值 4

class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;

public FinalFieldExample() {
x = 3;
y = 4;
}

static void writer() {
f = new FinalFieldExample();
}

static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}

我的困惑是,对象“Obj”具有最终字段和非最终字段是否已完全初始化并被线程“T”引用,T 只会看到最终字段的正确值?构造后未发生变化的非最终字段呢?我知道如果它们在构造线程“T”之后发生突变,可能看不到新值(除非该字段是 volatile )。但是,如果该字段是非最终的和非 volatile 的并且在构建后没有发生变化,我会怎样?

JVM 如何实现与“final”相关的保证?例如,对于 volatile,存在内存障碍。

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