我想知道 JAVA 中 synchronized 和 final 之间的关系。我已经阅读了几篇文章,每个人都提到应该使用 final 字段在构造函数中初始化一个对象,否则未初始化的对象可能会导致使用同一对象的多个线程之间出现同步问题。
为了。例如下面的代码:
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;
int j = f.y;
}
}
}
读者可能会正确读取 x 的值,但可能会将 y 的值读取为 0,因为它没有被声明为 final。
为什么会这样?