(FORMデータとエンコーディング)[PREV][HOME][    ]

シングルトンと同期化


  訳書p491には、シングルトンのコード例が載っていますが、間違いが2つあります。
  まず第一は、フィールドにstatic修飾子が必要です:
【誤】private BookPool pool = null;
【正】private static BookPool pool = null;
  もうひとつ重要なことは、インスタンスを返すファクトリメソッドに対する正しい同期化が必要です:
【誤】
public static BookPool getInstance(){
  if (pool == null){
    pool = new BookPool(...);
  }
  return (pool);
}
----------------------------------------------
【正】... 訂正060825
public static synchronized BookPool getInstance(){
  if (pool == null){
    pool = new BookPool(...);
  }
  return (pool);
}
[参考] : Javaによるスレッドセーフなシングルトンの作り方

  なお、二重のsynchronizedブロックを使ってif(pool==null)をダブルチェックするやり方は、今ではアンチパターン(無効なイディオム)という評価が下っています。このページをご一読ください。

(FORMデータとエンコーディング)[PREV][HOME][    ]