「ダブル・チェック・ロッキング」の版間の差分

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


<source lang="java">
<source lang="java">