ホームページ >Java >&#&チュートリアル >Java でデッドロックが発生する状況は何ですか?

Java でデッドロックが発生する状況は何ですか?

WBOY
WBOY転載
2023-05-19 12:46:061212ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。