料AboutJavaScriptを有効にして、ご利用ください。クラスの初期化中にバックグラウンドスレッドを使用しないクラスの初期化中にバックグラウンドスレッドを開始して使用する場合、クラスの初期化が循環し、デッドロック状態になるおそれがある。クラスの初期化を実行するメインスレッドがバックグラウンドスレッドの終了を待ち、バックグラウンドスレッドの方は、メインスレッドがクラスの初期化を終了するのを待つ状況である。プログラムでは、スレッドを開始する前にクラスの初期化を確実に完了しておかなければならない。宣言されたコードブロック)が、クラス初期化の一環としてバックグラウンドスレッドを開始している。クラスの全メンバが初期化されるまで待たなければならない。初期化が完了していないオブジェクトを公開しない」を参照)。したがって、バックグラウンドスレッドは、処理を進める前に、メインスレッドの初期化が終了するのを待つ必要がある。メソッドを呼び出して、バックグラウンドスレッドが終了するのを待っている。オブジェクトの構築時にthis参照を逸出させない」を参照)。タスクを周期的に実行するタイマーを作成し、その開始を初期化のためのコード内で行うと、活性(liveness)の問題を誘発しうる。初期化子からバックグラウンドスレッドをまったく生成せずに、すべてのフィールドをメインスレッド内で初期化している。オブジェクトからデータベース接続を初期化しており、各スレッドがそれぞれ固有のデータベース接続インスタンスを獲得できる。初期化子は、オブジェクト間で共有されるクラスフィールドを初期化するために使うことができる。メソッドから初期化することも可能である。どのフィールドにもアクセスしないスレッドであれば、クラス初期化中にバックグラウンドスレッドとして開始してもかまわない。2002]に基づく)は、オブジェクトが参照されなくなってもガベージコレクションの対象にならないようにするため、オブジェクト参照を格納する仕組みを提供している。クラスもガベージコレクションされることはない。シングルトンオブジェクトのインスタンスを複数作らない」を参照)。初期化処理には、このクラスのインスタンスを使用するバックグラウンドスレッドの作成が含まれている。呼び出すことにより無期限に待機状態となり、JVMが生存する間ずっと存在し続ける。このオブジェクトはデーモンスレッドにより管理されているので、JVMの通常の終了を妨害することはない。初期化処理はバックグラウンドスレッドの開始を含んではいるが、開始されたバックグラウンドスレッドはフィールドへのアクセスを行うことも、活性や安全性の問題を引き起こすこともない。したがって上記のコードは、安全かつ有用な例外である。リスク評価クラス初期化中にバックグラウンドスレッドを開始すると、デッドロック状態を引き起こす危険がある。Singleton"翻訳元これは以下のページを翻訳したものです。有このページは役に立ちましたか?javascriptを有効にすると、ご回答いただけます。その他のご意見はPCサイトにて入力願います。