メインメニューを開く

差分

ダブル・チェック・ロッキング

136 バイト追加, 2015年12月10日 (木) 00:45
<source lang="java">
Person hage = new Person();
hage.say();
</source>
これが一部のJava実装では以下のような動作になる。
# 1行目で[[メモリ]]上に[[インスタンス]]が確保さる。が確保される。#: hageいわゆるmallocが実行されhage[[変数]]自体は[[null]]ではなくなる。# : ただし[[コンストラクタ]]は実行されない。はまだ実行されない。# 2行目の初めて使うときにコンストラクタが実行される。#: [[コンストラクタ]]が実行されるタイミングは、オリジナル(newを実行した[[スレッド]]の持つ)インスタンスに対して外部から[[メンバー関数]]や[[メンバー変数]]に初回アクセスがあったとき。これをに初回アクセスがあったときとなる。これを[[遅延初期化]](lazy initialization)という。これによりhage[[変数]]自体は[[null]]ではないので後続スレッドはコンストラクタを実行していない不完全な[[インスタンス]]の[[参照]]を取得できてしまう。
<source lang="java">
匿名利用者