2

Java アプリケーションでまた別のデッドロックが発生し、将来の潜在的なデッドロックを検出する方法について考え始めました。これを行う方法についてはアイデアがありましたが、ほとんど単純すぎるようです。

それについての人の意見を聞きたいです。

典型的なデータセットを使用して、テスト環境でアプリケーションを数時間実行する予定です。

アプリケーションでバイトコード操作を実行して、ロックを取得するたびに (同期ブロックに入るなど)、ロックの詳細を ThreadLocal リストに追加することは可能だと思います。

後で、すべてのスレッドのリストを比較し、同じペアのロックが逆の順序で含まれているかどうかをチェックするアルゴリズムを作成できます。これは、デッドロックの可能性として報告されます。ここでも、バイトコード操作を使用して、この定期的なチェックをアプリケーションに追加します。

だから私の質問はこれです: このアイデアは (a) オリジナルで (b) 実行可能ですか?

4

4 に答える 4

4

これは、並行性のコースを受講したときに話し合ったものです。実装がオリジナルであるかどうかはわかりませんが、潜在的なデッドロックを判別するための分析の概念は一意ではありません。JCarderなどのJava用の動的分析ツールがあります。静的に実行できるいくつかの分析に関する研究もあります。

確かに、私が周りを見回してから数年が経ちました。JCarderが私たちが話し合った特定のツールではなかったと思います(少なくとも、名前はなじみのないように聞こえますが、他に何も見つかりませんでした)。しかし、ポイントは、デッドロックを検出するための分析は元の概念ではないということです。まず、使用可能なツールを作成した研究を出発点として検討します。実装ではないにしても、アルゴリズムは一般的に利用可能であると思われます。 。

于 2012-08-31T12:27:05.890 に答える
3

Lock独自の実装を提供することで、これと同様のことを行いました。

最近はアクター モデルを使用しているため、データをロックする必要はほとんどありません (変更可能な共有データがほとんどないため)。

于 2012-08-31T12:24:08.990 に答える
2

ご存じない場合は、Java MX Beanを使用して、デッドロックされたスレッドをプログラムで検出できます。これはテストでは役に立ちませんが、少なくとも本番環境での検出と回復を改善するのに役立ちます。

ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
long[] deadLockedThreadIds = threadMxBean.findMonitorDeadlockedThreads();
// log the condition or even interrupt threads if necessary
...
于 2012-08-31T12:23:46.007 に答える
0

そうすれば、いくつかのデッドロックを見つけることができますが、それらがないことを証明することはできません。同期されたメソッドごとに注釈が供給される、一種のバイトコード分析ツールである静的チェック ツールを開発したほうがよいでしょう。注釈は、リソース グラフ内の注釈付きメソッドの場所を示す必要があります。タスクは、グラフ内のループを見つけることです。各ループはデッドロックを意味します。

于 2012-08-31T12:37:49.920 に答える