「ダブル・チェック・ロッキング」の版間の差分
編集の要約なし |
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行目で[[メモリ]]が確保される。 | ||
#: | #: いわゆるmallocが実行されhage[[変数]]自体は[[null]]ではなくなる。 | ||
# [[コンストラクタ]] | #: ただし[[コンストラクタ]]はまだ実行されない。 | ||
#: [[コンストラクタ]]が実行されるタイミングは、オリジナル(newを実行した[[スレッド]]の持つ)インスタンスに対して外部から[[メンバー関数]]や[[メンバー変数]] | # 2行目の初めて使うときにコンストラクタが実行される。 | ||
#: [[コンストラクタ]]が実行されるタイミングは、オリジナル(newを実行した[[スレッド]]の持つ)インスタンスに対して外部から[[メンバー関数]]や[[メンバー変数]]に初回アクセスがあったときとなる。これを[[遅延初期化]](lazy initialization)という。これによりhage[[変数]]自体は[[null]]ではないので後続スレッドはコンストラクタを実行していない不完全な[[インスタンス]]の[[参照]]を取得できてしまう。 | |||
<source lang="java"> | <source lang="java"> | ||