Javaスレッドの優先順<BR />避ける必要があるマルチタスクに関連する特別なタイプのエラーは行き詰まりです。デッドロックは、2つのスレッドが同期オブジェクトのペアに循環依存性を持っている場合に発生します。たとえば、1つのスレッドがオブジェクトXのパイプラインに入力し、別のスレッドがオブジェクトYのパイプラインに入るとします。 XのスレッドがYの同期メソッドを呼び出そうとすると、予想どおりロックされます。 Yスレッドはまた、Xのいくつかの同期メソッドを呼び出したいと考えています。スレッドは永遠に待機します。なぜなら、Xに到達するには、最初のスレッドを完成させるために独自のYのロックをリリースする必要があるからです。デッドロックは、次のようにデバッグするのが非常に難しいエラーです。
通常、それはめったに起こりません。また、2つのスレッドの期間が一致する場合にのみ発生します。
3つ以上のスレッドと同期オブジェクトが含まれる場合があります(つまり、説明した例よりも複雑なイベントシーケンスがある場合、デッドロックが発生する可能性があります)。
デッドロックを完全に理解するために、その行動を観察することは有用です。次の例では、それぞれfoo()とbar()メソッドを使用して、aとbの2つのクラスを生成します。これらの2つの方法には、他のクラスの方法を呼び出す前に、短時間の一時停止があります。デッドロックという名前のメインクラスは、AとBのインスタンスを作成し、2番目のスレッドを起動してデッドロック環境を設定します。 foo()およびbar()メソッドは、sleep()を使用してデッドロックを強制します。
// Deadlock.Class a {Synchronized void foo(b b){strune.currentthread()。getname();スレッド(1000) (); synchronized last(){system.out.println( "Inside a.last")}} system.out.println(b.bar ")try {sweey(1000)} n(a.lastを呼び出そうとする "); {a = new b(); ();他のスレッドでロックします。プログラムを実行した後、出力は次のとおりです。
MainThread Entered A.FooracingThreadは、b。last()racingthreadに電話をかけようとしてb.barmainthreadを入力しましたa.last()を呼び出そうとして
プログラムはデッドロックされているため、CTRL-Cを押してプログラムを終了する必要があります。 PCでCtrl-Break(またはSolarisの下のCtrl-/を押す)を押すと、完全なスレッドとパイプラインバッファのヒープが表示されます。 RacingThreadは、管理プロセスAを待っている間に管理プロセスBを占有していることがわかります。同時に、MainThreadは管理プロセスを待機していますb。プログラムは決して終わりません。この例が示すように、マルチスレッドプログラムはしばしばロックされており、デッドロックが最初に確認する必要がある問題です。
Javaスレッドデッドロック<BR />避ける必要があるマルチタスクに関連する特別なタイプのエラーはデッドロックです。デッドロックは、2つのスレッドが同期オブジェクトのペアに循環依存性を持っている場合に発生します。たとえば、1つのスレッドがオブジェクトXのパイプラインに入力し、別のスレッドがオブジェクトYのパイプラインに入るとします。 XのスレッドがYの同期メソッドを呼び出そうとすると、予想どおりロックされます。 Yスレッドはまた、Xのいくつかの同期メソッドを呼び出したいと考えています。スレッドは永遠に待機します。なぜなら、Xに到達するには、最初のスレッドを完成させるために独自のYのロックをリリースする必要があるからです。デッドロックは、次のようにデバッグするのが非常に難しいエラーです。
通常、それはめったに起こりません。また、2つのスレッドの期間が一致する場合にのみ発生します。
3つ以上のスレッドと同期オブジェクトが含まれる場合があります(つまり、説明した例よりも複雑なイベントシーケンスがある場合、デッドロックが発生する可能性があります)。
デッドロックを完全に理解するために、その行動を観察することは有用です。次の例では、それぞれfoo()とbar()メソッドを使用して、aとbの2つのクラスを生成します。これらの2つの方法には、他のクラスの方法を呼び出す前に、短時間の一時停止があります。デッドロックという名前のメインクラスは、AとBのインスタンスを作成し、2番目のスレッドを起動してデッドロック環境を設定します。 foo()およびbar()メソッドは、sleep()を使用してデッドロックを強制します。
// Deadlock.Class a {Synchronized void foo(b b){strune.currentthread()。getname();スレッド(1000) (); synchronized last(){system.out.println( "Inside a.last")}} system.out.println(b.bar ")try {sweey(1000)} n(a.lastを呼び出そうとする "); {a = new b(); ();他のスレッドでロックします。プログラムを実行した後、出力は次のとおりです。
MainThread Entered A.FooracingThreadは、b。last()racingthreadに電話をかけようとしてb.barmainthreadを入力しましたa.last()を呼び出そうとして
プログラムはデッドロックされているため、CTRL-Cを押してプログラムを終了する必要があります。 PCでCtrl-Break(またはSolarisの下のCtrl-/を押す)を押すと、完全なスレッドとパイプラインバッファのヒープが表示されます。 RacingThreadは、管理プロセスAを待っている間に管理プロセスBを占有していることがわかります。同時に、MainThreadは管理プロセスを待機していますb。プログラムは決して終わりません。この例が示すように、マルチスレッドプログラムはしばしばロックされており、デッドロックが最初に確認する必要がある問題です。