2

JLS セクション 12.4.2を読んだ後。

2. C の Class オブジェクトが、他のスレッドによって C の初期化が進行中であることを示している場合は、LC を解放し、進行中の初期化が完了したことが通知されるまで現在のスレッドをブロックし、その時点でこの手順を繰り返します。

現在のスレッドは、他のスレッドによって取得された LC を解放する必要がありますか? このアクションは安全ですか? アプリでクラスまたはインターフェイスの初期化が何回発生しますか?ありがとう。

4

1 に答える 1

4

JVMの契約では、アプリケーションスレッドがクラスの使用を許可される前に、クラスのロードが完了します。「ロードが完了した」とは、すべての静的初期化子が完了したことを意味します(つまり、すべての静的ブロックが実行され、静的フィールドがコード化された順序で初期化されます)。

クラスは最初に使用されたときにロードされるため、(暗黙的に)発生するスレッドはすべてClassLoaderを呼び出してクラスをロードし、ClassLoaderがクラスのロードを完了する間(上記のとおり)ブロックします。クラスのロード中にクラスを使用する他のスレッドも、クラスのロードが完了するのを待つことをブロックします。

クラスは、JVMの起動ごとに1回ロードされます。


衒学者への注意:はい、ClassLoader kung fuを使用してクラスをリロードすることは可能ですが、この説明は誤解を招くものではありません。

于 2012-07-17T05:11:44.623 に答える