3

二重チェックのロック パターンを使用しているときに、よく知られた落とし穴がありました (例と説明は「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 として評価できますか?

4

2 に答える 2

3

はい、一部のスレッドは可能です。あなたが投稿したコードは、最近正しく動作します。DCL パターンに欠陥があったのは、以前のメモリ モデル (Java 1.5 より前) のみでした。

また、遅延読み込みシングルトンを作成する最良の方法はシングルトン列挙型パターンを使用することであるため、DCL は最近では廃止されています。

于 2014-08-14T19:51:54.203 に答える