ホームページ >Java >&#&チュートリアル >Java でデッドロックが発生する状況は何ですか?
4 つの状況
1. クロス ロックはプログラムのデッドロックを引き起こします: たとえば、スレッド A は R1 のロックを保持して R2 のロックを待ち、スレッド B は R1 のロックを保持します。 R2 は、R1 のロックを待ちます。ロック
2。メモリ不足: たとえば、2 つのスレッド T1 と T2 があります。T1 は 10MB のメモリを取得し、T2 は 15MB のメモリを取得しました。T1 と T2 は両方ともT2 が動作するには 30MB のメモリを取得する必要がありますが、残りの利用可能なメモリは 10MB であるため、両方のスレッドはお互いにメモリ リソースを解放するのを待ちます
3. 質疑応答データ交換: サーバー特定のポートを開いて、クライアントがそのポートにアクセスするのを待ちます。クライアントがリクエストを送信した後、サーバーは何らかの理由で失敗します。その理由は、クライアントのリクエストが見逃され、クライアントがサーバーの応答を待つことになり、サーバーがクライアントがリクエストを送信するのを待っています
4. 無限ループによるデッドロック: 比較的一般的です. jstack などのツールではデッドロックを確認できませんが、プログラムが動作せず、CPU 使用率が高くなります。この種のデッドロックはシステム一時停止アニメーションとも呼ばれ、トラブルシューティングと再現が困難です。
インスタンス
public class Main { private final Object MUTEX_READ = new Object(); private final Object MUTEX_WRITE = new Object(); public void read(){ synchronized (MUTEX_READ){ synchronized (MUTEX_WRITE){ } } } public void write(){ synchronized (MUTEX_WRITE){ synchronized (MUTEX_READ){ } } } public static void main(String[] args) throws InterruptedException { Main m = new Main(); new Thread(()->{ while (true){ m.read(); } }).start(); new Thread(()->{ while (true){ m.write(); } }).start(); } }
以上がJava でデッドロックが発生する状況は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。