41

私がいくつかのJavaコードを持っているとしましょう:

public class SomeClass {
    static {
        private final double PI = 3.14;
        private final double SOME_CONSTANT = 5.76;
        private final double SOME_OTHER_CONSTANT = 756.33;
    }

  //rest of class
}

スレッドがSomeClassのClassオブジェクトを初期化していて、2番目のスレッドがSomeClassのオブジェクトを再度ロードしたいときに静的ブロックの値を初期化している途中の場合、Class静的ブロックはどうなりますか?最初のスレッドが実行されていなくても、2番目のスレッドはすでに初期化されていると想定してそれを無視しますか?それとも何か他のことが起こりますか?

4

5 に答える 5

51

最初のスレッドが SomeClass の初期化を完了していない場合、2 番目のスレッドはブロックされます。

これについては、セクション 12.4.2の Java 言語仕様で詳しく説明されています。

于 2009-01-20T19:28:40.697 に答える
17

静的クラスの初期化は、Java によってスレッドセーフであることが保証されています。

于 2009-01-20T19:25:00.453 に答える