2

静的な「定数」(つまり、初期化後に変更されない) データ構造を初期化したい状況があります。「静的 {}」コード ブロックでこれを行っています。このコード ブロックが 2 回実行されないことが保証されていますか? 特別な場合に同期が必要ですか?

更新: 答えの一部はAre Java static initializers thread safe?にあります。

疑問が残ります:静的初期化子を複数回実行するにはどうすればよいですか? そして、それは問題ですか?異なる静的な「インスタンス」に対して複数回実行されると思います。異なる webapp コンテキストで、互いに「見えない」ように異なるクラス ローダーにアタッチされます。正しい?

4

2 に答える 2

2

JVM は、すべてのクラスの静的イニシャライザ ブロックが一度だけ呼び出されることを保証します (クラスが最初にロードされるとき)。一度だけ呼び出されるため、同期コードは必要ありません。これは、 Only Onceルールと矛盾するためです。

クラスローディングと静的クラス初期化子の詳細については、こちらをご覧ください。

そのページからの引用:

コンパイラが実際に行うことは、すべての静的変数初期化子とコードのすべての静的初期化子ブロックをクラス宣言に現れる順序で結合する単一のクラス初期化ルーチンを内部的に生成することです。この単一の初期化手順は、クラスが最初にロードされるときに 1 回だけ自動的に実行されます。   –デビッド・フラナガン

于 2013-03-17T17:15:43.697 に答える
1

静的な「定数」(つまり、初期化後に変更されない) データ構造を初期化したい

その変数を final にします。

お気に入り

public static final CONSTANT = 10;

また

そのコードを静的ブロックに入れることができます。クラスのロード時に一度実行されます。

于 2013-03-17T17:07:42.627 に答える