8

java.lang.Class.newInstance0()JDK 1.7 Update 7 で次の注意事項を見つけました。

注: 次のコードは、現在の Java メモリ モデルでは厳密には正しくない可能性があります。

誰でも理由を説明できますか?

4

2 に答える 2

5

私が見ることができるこのコードの唯一の問題は、「cachedConstructor」フィールドが揮発性であり、スレッド間の値の可視性の効果を保証することです.スレッドの 1 つ、つまり初期化シーケンスがアトミックではありません。これは、 cachedConstructor が同時に数回割り当てられる可能性があることだけにつながりますが、同じ Constructor インスタンスになることを誰も明確に依存していない場合、コードを壊すことはありません。cachedConstructor 初期化ブロックが同期される場合、それはアトミックになります。つまり、cachedConstructor は競合状態に関係なく 1 回だけ割り当てられます。

つまり、コードは適切に機能するはずですが、複数のスレッドによるキャッシュされた値の過剰な再計算を同時に許可するだけです。

于 2012-11-01T12:58:15.553 に答える
1

現在の Java メモリ モデル

問題は「どのくらい最新か」です。

そのコードはおそらく 1.4 以前の非常に古いものであり、それ以降は誰も触れていません。

作成者は、新しいメモリ モデルが開発中であることをおそらく認識していました。

于 2012-11-01T17:36:01.910 に答える