二重チェックのロック パターンを使用しているときに、よく知られた落とし穴がありました (例と説明は「Concurrency in Practice」から引用)。
@NotThreadSafe
public class DoubleCheckedLocking {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}
}
一部のスレッドは、オブジェクト自体がまだ構築中である間に、'resource' 変数の初期化された値を確認する場合があります。
問題は、リソース オブジェクトを何らかのメソッドで構築している場合に問題が残るかどうかです。いえ
resource = createResource();
createResource() メソッドでリソース オブジェクトがまだ構築中であるときに、一部のスレッドがリソース != null を true として評価できますか?