コンテンツへスキップ
Java例外致命的
Deadlock

Deadlock

2 つ以上のスレッドが互いにロックを解放するのを待って永遠にブロックされている。

jvmspring

このエラーの原因

スレッド A がロック 1 を保持しながらロック 2 を待ち、スレッド B がロック 2 を保持しながらロック 1 を待つ。どちらのスレッドも処理を進められず、アプリケーションがハングする。これは例外ではなくランタイム状態。

修正方法

ロックは常に一定の順序で取得します。タイムアウト付きの tryLock() を使います。synchronized ブロックの範囲を最小限にします。ロックを手動で扱う代わりに、java.util.concurrent のユーティリティを使います。デッドロックの検出には jstack を使います。

公式ドキュメント

関連するエラーコード