ホームページ  >  記事  >  Java  >  Javaでデッドロックが発生する状況は何ですか?

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

王林
王林転載
2023-05-23 12:46:061051ブラウズ

#4 java でデッドロックが発生する状況

##1. クロスロックはプログラムのデッドロックを引き起こします: たとえば、スレッド A は R1 のロックを保持して R2 のロックを待ち、スレッド B は R2 のロックを保持します。そしてR1のロックを待ちます。

2. メモリ不足: たとえば、2 つのスレッド T1 と T2 があります。T1 は 10MB のメモリを取得し、T2 は 15MB のメモリを取得しました。T1 と 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 までご連絡ください。