質問は実際には別の質問を参照しており、おそらく適切に定式化されていないため、重複としてクローズされました。
このコード サンプル (マルチスレッド環境で) の二重チェック ロックの代わりに、効果的な代替の遅延初期化イディオムは次のとおりです。
public class LazyEvaluator {
private final Object state;
private volatile LazyValue lazyValue;
public LazyEvaluator(Object state) {
this.state = state;
}
public LazyValue getLazyValue() {
if (lazyValue == null) {
synchronized (this) {
if (lazyValue == null) {
lazyValue = new LazyValue(someSlowOperationWith(state), 42);
}
}
}
return lazyValue;
}
public static class LazyValue {
private String name;
private int value;
private LazyValue(String name, int value) {
this.name = name;
this.value = value;
}
private String getName() {
return name;
}
private int getValue() {
return value;
}
}
}
編集遅い操作を含めるように更新し、マルチスレッド環境に関する明示的な言及を追加しました