Java 5 以降のみ。マルチプロセッサの共有メモリ コンピューターを想定します (おそらく、現在使用しているコンピューターの 1 つです)。
シングルトンの遅延初期化のコードは次のとおりです。
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
オプティマイザーが次のように getInstance() を書き換えないようinstance
に宣言する必要があります (順次プログラムでは正しいでしょう)。volatile
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
// instance must be null or we wouldn't be here (WRONG!)
instance = new MySingleton();
}
}
}
オプティマイザがコードを書き直さないと仮定すると、instance
宣言されていない場合でも、ブロックが終了volatile
したときにメモリにフラッシュされ、ブロックが入力されたときにメモリから読み取られることが保証されますか?synchronized
synchronized
編集: getInstance() を静的にするのを忘れていました。それが答えの妥当性を変えるとは思いません。あなたは皆、私が何を意味するかを知っていました。