【JAVA】nullでもインスタンスでも無い状態!?

今回の記事は少し難しいかもしれません。
その上、結構マニアックな話です。覚悟してください(笑)

会社の上司や先輩などにデザインパターンを習えといわれたことはありませんか?

デザインパターンの中にシングルトンパターンというものがあります。

今日はシングルトンパターンというもののTIPS的なお話をしたいと思います。
もし、シングルトンパターンというのを知らない方は上のリンクを参照してみてください。
簡単に言うと1つしかないという意味です

参考書などを見るとシングルトンパターンの例が下のように記載されていることがあります。
でも、実はこれ厳密にいうと間違いなのです。

さて、どこが間違えているかわかりますか??


private static Singleton instance;

public static Singleton getInstance() {
  if (instance == null) {
    synchronized(Singleton.class) {
      if (instance == null) {
        instance = new Singleton();
      }
    }
  }
  return instance;
}

まずは、上のソースの解説をしたいと思います。

4行目でSingletonのインスタンスが生成されているかを確認します。

5行目では、インスタンスが未作成の場合、他のスレッドからSingletonの
インスタンスを生成されないようロックをかけています。

6行目では、もう一度インスタンスが作られていないかを確認しています。
これは、4行目の条件判断の最中に別のスレッドでインスタンスを作成されていないということを確認するためです。

7行目の処理は、ロックもしているし、他のスレッドからインスタンスが作成されていないので
安心して自分が代表者になって唯一のインスタンスを生成!

という考えの基に書かれたコーディングです。


理論上正しいように思えるのですが、実際は違います。


なんと、nullでもなくインスタンスでも無い状態がJAVAにはあるのです。

すごく簡単に説明すると

1.instanceはnullである。
2.instanceをnullからインスタンスへ書き換えるため「null」という状態をはずす。
3.instanceはインスタンスですよとあらためて登録する。

ということをしているのです。

つまり、別のスレッドが2の状態で6行目のif文を通過し、
インスタンスを生成してしまうことがありえるのです。


では、シングルトンパターンは実際には実装できないのでしょうか?

気になるかたは、下記のリンクを参照してみてください。
もっと詳しく書かれています。
http://www.ibm.com/developerworks/jp/java/library/j-dcl/



参考になりましたらクリックしていただけると励みになります。



【【JAVA】意外と知らない基礎知識の最新記事】
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。