1

Javaプログラムのスレッドダンプを取りましたが、それはと言っていましたFound one Java-level deadlock

このプログラムにバグがあることを自信を持って確認できますか?

私には、デッドロックはプログラミングの問題のように思えます。唯一の解決策は、ソースコードを修正することです。
私が間違っている?デッドロックがプログラムの実行の通常の部分であり、デッドロックが最終的に何らかの形で解消される状況はありますか?

これは、何百人ものユーザーがいる、かなり従来型のJavaWebアプリケーションです。互いに待機している2つのスレッドは、1つのTomcatリクエストワーカーと1つのLuceneインデックス作成ジョブのようです。どちらもを使用してsun.misc.Unsafe.parkいます。私の知る限り、このプログラムにはスレッド監視のメタ洗練がありません。

4

2 に答える 2

4

デッドロックがプログラムの実行の通常の部分であり、デッドロックが最終的に何らかの形で解消される状況はありますか?

理論的にはそうです、デッドロックの種類によって異なります。

たとえば、2つのスレッドがObject.wait()デッドロックした場合、待機呼び出しの1つが(最終的に)タイムアウトになる可能性があります。または、3番目のスレッドは、デッドロックされたスレッドの1つを呼び出すことにより、デッドロックを解除できThread.interrupt()ます。これは、意図的なデッドロックを破る戦略として、またはその他の理由で行われる可能性があります。

一方、プリミティブミューテックスの取得のデッドロックは、それ自体で解消されることはなく、非推奨のスレッド停止/強制終了メソッドの1つを呼び出す以外に解消することはできません。その場合、データ構造が中間状態のままになる可能性があり、ロックを解除した後も続行するのが困難になります。


探すべき重要なことは、ブロッキングアクションが中断可能かどうかです。InterruptedException例えば、それがまたは同様のものを投げることができるかどうか。

于 2012-07-03T03:03:23.883 に答える
0

これは一種の例外のようなものです(非常に嫌で醜いものですが:)):デッドロックを処理する準備ができている場合、アプリケーションで発生する可能性があるため(たとえば、JavaでDBサーバーを作成している場合)、何もありません。それらに間違っています。

とは言うものの、ほとんどの場合、チェックされていない例外のように、それは本当にバグであり、恐ろしいNPE :(

于 2012-07-03T03:08:36.573 に答える