静的初期化子は、クラスへの最初の参照の前に 1 回実行されることになっています。これは、クラスがアクセスされるたびに、クラスの静的初期化子が実行されているかどうかをチェックする必要があることを意味します。
マルチスレッド環境では、クラスが複数のスレッドによってアクセスされるときに同期が必要になるため、非自明な静的初期化子を持つクラスが競合の原因になる可能性があるようです。
私の質問は、静的初期化子によって導入されたクラス定義に対するそのような暗黙的なロックの影響を最小限に抑える最善の方法は何ですか?
4 に答える
1
静的コンストラクターの実行は、アプリケーション ドメイン内で次のイベントの最初の発生によってトリガーされます。
- クラスのインスタンスが作成されます。
- クラスの静的メンバーのいずれかが参照されている
静的コンストラクターを呼び出すときの同時実行の問題を処理するのは、クラス ローダーの責任です。
于 2009-08-10T15:43:05.337 に答える
1
あまり異論はないと思います。クラスがロードされると、初期化子が実行されます。クラスがすでにロードされている場合は、チェックを行う必要はありません。
于 2009-06-25T17:28:06.637 に答える
0
仕様には、「そのクラスの静的フィールドを最初に使用する前に、実装に依存する時点で実行される」と書かれています。
したがって、スレッドの同期を気にする必要があることを実装が理解していると想定できます (悲観的であれば期待できます)。
于 2009-06-25T17:59:10.453 に答える
0
これは JIT コンパイルの一部として機能すると思います。静的イニシャライザが jit されて実行されると、それを実行する必要がなくなるため、複数のスレッドとの同期の問題はなくなります。もちろん、JIT エンジンはスレッドセーフです。
ニック。
于 2009-07-24T14:30:34.807 に答える