私の質問はこれの拡張です:揮発性の保証と順不同の実行
より具体的にするために、初期化後に 2 つの状態になる単純なクラスがあるとします。
class A {
private /*volatile?*/ boolean state;
private volatile boolean initialized = false;
boolean getState(){
if (!initialized){
throw new IllegalStateException();
}
return state;
}
void setState(boolean newState){
state = newState;
initialized = true;
}
}
初期化されたフィールドはvolatileと宣言されているため、事前発生の「バリア」が導入され、並べ替えが行われないことが保証されます。状態フィールドは、初期化されたフィールドが書き込まれる前に のみ書き込まれ、初期化されたフィールドが読み取られた後にのみ読み取られるため、状態の宣言からvolatileキーワードを削除しても、古い値が表示されることはありません。質問は次のとおりです。
- この推論は正しいですか?
- 初期化されたフィールドへの書き込みが最適化されず (初回のみ変更されるため)、「バリア」が失われないことが保証されていますか?
フラグの代わりに、次のようにCountDownLatchが初期化子として使用されたとします。
class A { private /*volatile?*/ boolean state; private final CountDownLatch initialized = new CountDownLatch(1); boolean getState() throws InterruptedException { initialized.await(); return state; } void setState(boolean newState){ state = newState; initialized.countdown(); } }
それでもよろしいでしょうか?