2017-04-25 10 views

答えて

1

デッドロックを検出する一般的な方法は2つあります。

1つはスレッドにチェックポイントを設定させることです。たとえば、ワークループを持つスレッドがある場合は、作業を開始するときに、作業に時間がかかる可能性があると考えられるよりも長く設定されているタイマーを設定します。タイマーが起動すると、スレッドがデッドロックしているとみなされます。作業が完了したら、タイマーをキャンセルします。

別の(組み合わせて使用​​されることもある)別のスレッドは、スレッドがブロックする可能性のある他のリソースを追跡する可能性があることがあります。これは、他のスレッドが逆の順序でこれらのロックを取得したときに、別のスレッドを保持しながら一方のロックを取得しようとする試みを直接検出できます。

デッドロックが実際に発生することなく、デッドロックの危険性を検出することさえできます。一方のスレッドがロックAとBを取得し、もう一方のスレッドがロックBとAを取得した場合、重複しない限りデッドロックは発生しません。しかし、この方法はそれを検出することができます。

アドバンストデッドロック検出は、通常、デバッグ中にのみ使用されます。デッドロックの可能性を各ブロッキング・ロックでチェックするアプリケーションをコーディングする以外に、デッドロックが発生した場合の対処方法を知っているだけで、デッドロックが発生した後でアプリケーションを停止させることができます。ロックされているリソースが矛盾した状態にある可能性があるため、ロックを盲目的に解放することはできません。

デッドロックが発生する可能性のあるコードを意図的に記述し、問題を回避するためにコードを記述することがあります。たとえば、多くのスレッドがロックAを取得してからロックBを獲得しようとしている場合、他のスレッドはその逆を行う必要があることを知っている場合、Bをロックし、 。

通常、デッドロックを検出してデッドロックを回避するのではなく、デッドロックを不可能にすることは、通常は役に立ちます。

+0

デッドロックを検出するためにJavaスレッドダンプを使用できますか?ブロックされたスレッドには通知できますが、デッドロックを検出できるかどうかは不明です。 –

+0

@AmberBeriwalそれは働くことができます。すべてのスレッドスタックのダンプを使って、どのスレッドがロックを取得しようとしているのか、そしてどのスレッドがそのロックを保持しているのかを調べることができます。あなたがスレッドをたくさん持っているのは面倒ですが、不可能ではありません。 –

関連する問題