JAVAの同期と最終の関係を知りたいです。私はいくつかの記事を読みましたが、コンストラクターで最終フィールドを使用してオブジェクトを初期化する必要があると誰もが言及しています。そうしないと、初期化されていないオブジェクトが同じオブジェクトを使用する複数のスレッド間で同期の問題を引き起こす可能性があります。
為に。たとえば、以下のコード:
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 として読み取ることがあります。
なぜこうなった?