最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java死鎖問題解決方案及示例詳解

 更新時間:2025年06月10日 11:35:02   作者:拾荒的小海螺  
死鎖是指兩個或多個線程因爭奪資源而相互等待,導(dǎo)致所有線程都無法繼續(xù)執(zhí)行的一種狀態(tài),本文給大家詳細介紹了Java死鎖問題解決方案詳解及實踐樣例,需要的朋友可以參考下

1、簡述

死鎖(Deadlock) 是指兩個或多個線程因爭奪資源而相互等待,導(dǎo)致所有線程都無法繼續(xù)執(zhí)行的一種狀態(tài)。

死鎖的四個必要條件:

  • 互斥條件:某資源一次只能被一個線程占用。
  • 占有且等待:一個線程已持有資源并等待其他線程的資源。
  • 不可剝奪:資源不能被強行從線程中剝奪。
  • 循環(huán)等待:多個線程形成一種頭尾相接的等待資源關(guān)系鏈。

只要這四個條件同時滿足,就可能產(chǎn)生死鎖。

2、死鎖示例代碼

下面是一個典型的死鎖示例:

public class DeadlockExample {
    private static final Object LockA = new Object();
    private static final Object LockB = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (LockA) {
                System.out.println("Thread-1: locked A");

                try { Thread.sleep(100); } catch (InterruptedException e) {}

                synchronized (LockB) {
                    System.out.println("Thread-1: locked B");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (LockB) {
                System.out.println("Thread-2: locked B");

                try { Thread.sleep(100); } catch (InterruptedException e) {}

                synchronized (LockA) {
                    System.out.println("Thread-2: locked A");
                }
            }
        });

        t1.start();
        t2.start();
    }
}

運行這段程序可能會導(dǎo)致 Thread-1 等待 LockBThread-2 等待 LockA,從而產(chǎn)生死鎖。

3、如何檢測死鎖?

3.1 使用 jstack

當(dāng)應(yīng)用卡住時,使用如下命令查看線程堆棧:

jps      # 查找 Java 進程 ID
jstack <pid>

你會看到類似:

Found one Java-level deadlock:
"Thread-1": waiting to lock monitor 0x000..., which is held by "Thread-2"
...

3.2 使用 VisualVM 或 JConsole

這類工具可以圖形化展示線程狀態(tài),識別死鎖非常直觀。

4、如何預(yù)防和解決死鎖?

4.1 統(tǒng)一資源獲取順序(推薦)

確保多個線程獲取多個鎖時 按相同順序加鎖。

public void safeMethod() {
    synchronized (LockA) {
        synchronized (LockB) {
            // 安全操作
        }
    }
}

4.2 使用 tryLock() 避免無限等待

使用 ReentrantLock 的 tryLock() 方法設(shè)置獲取鎖的超時時間。

import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;

public class TryLockExample {
    private final ReentrantLock lockA = new ReentrantLock();
    private final ReentrantLock lockB = new ReentrantLock();

    public void run() {
        Thread t1 = new Thread(() -> {
            try {
                if (lockA.tryLock(1, TimeUnit.SECONDS)) {
                    System.out.println("Thread-1: locked A");
                    Thread.sleep(100);

                    if (lockB.tryLock(1, TimeUnit.SECONDS)) {
                        System.out.println("Thread-1: locked B");
                        lockB.unlock();
                    }
                    lockA.unlock();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                if (lockB.tryLock(1, TimeUnit.SECONDS)) {
                    System.out.println("Thread-2: locked B");
                    Thread.sleep(100);

                    if (lockA.tryLock(1, TimeUnit.SECONDS)) {
                        System.out.println("Thread-2: locked A");
                        lockA.unlock();
                    }
                    lockB.unlock();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
        new TryLockExample().run();
    }
}

4.3 使用 java.util.concurrent 包

避免使用低級的 synchronized,使用高級并發(fā)工具如 ExecutorServiceSemaphore、Lock 等更可控的工具。

4.4 死鎖檢測與恢復(fù)

一些大型系統(tǒng)中,可以通過定期掃描線程狀態(tài),自動檢測死鎖并重啟部分線程或服務(wù)。例如通過自定義 ThreadMXBean 檢測死鎖。

最佳實踐小結(jié):

技術(shù)手段說明
加鎖順序統(tǒng)一所有線程按相同順序獲取資源
tryLock + timeout嘗試加鎖失敗后避免長時間阻塞
lock 分解將大鎖拆分成小鎖減少競爭
并發(fā)工具替代 synchronized使用 ReentrantLock、Semaphore 等
死鎖檢測工具使用 jstack、VisualVM 等工具

5、結(jié)語

死鎖是多線程編程中不可忽視的問題,但并不是無法避免。只要我們在設(shè)計時保持鎖的有序性,并結(jié)合現(xiàn)代并發(fā)工具進行控制,絕大多數(shù)死鎖問題都是可以預(yù)防的。

以上就是Java死鎖問題解決方案及示例詳解的詳細內(nèi)容,更多關(guān)于Java死鎖問題解決的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea mybatis配置log4j打印sql語句的示例

    idea mybatis配置log4j打印sql語句的示例

    本篇文章主要介紹了idea mybatis配置log4j打印sql語句的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Springcloud?feign傳日期類型參數(shù)報錯的解決方案

    Springcloud?feign傳日期類型參數(shù)報錯的解決方案

    這篇文章主要介紹了Springcloud?feign傳日期類型參數(shù)報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    這篇文章主要介紹了springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能,是最簡單的一種注解方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 基于java構(gòu)造方法Vector查找元素源碼分析

    基于java構(gòu)造方法Vector查找元素源碼分析

    本篇文章是關(guān)于ava構(gòu)造方法Vector源碼分析系列文章,本文主要介紹了Vector查找元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • IDEA Debug模式下改變各類型變量值的方法

    IDEA Debug模式下改變各類型變量值的方法

    這篇文章主要介紹了IDEA Debug模式下改變各類型變量值的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 詳細全面解析Java泛型

    詳細全面解析Java泛型

    這篇文章主要介紹了詳細全面解析Java泛型,java泛型主要提高了Java 程序的類型安全,通過知道使用泛型定義的變量的類型限制,編譯器可以驗證類型假設(shè),消除源代碼中的許多強制類型轉(zhuǎn)換等多個有點,下面我們進入文章了解更多的詳細內(nèi)容吧
    2022-02-02
  • spring中ioc是什么

    spring中ioc是什么

    IoC是一種讓服務(wù)消費者不直接依賴于服務(wù)提供者的組件設(shè)計方式,是一種減少類與類之間依賴的設(shè)計原則。下面通過本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2017-09-09
  • Spring監(jiān)聽器及定時任務(wù)實現(xiàn)方法詳解

    Spring監(jiān)聽器及定時任務(wù)實現(xiàn)方法詳解

    這篇文章主要介紹了Spring監(jiān)聽器及定時任務(wù)實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java實現(xiàn)簡單圖書借閱系統(tǒng)

    Java實現(xiàn)簡單圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java的泛型你真的了解嗎

    java的泛型你真的了解嗎

    這篇文章主要為大家詳細介紹了java的泛型,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

鹿邑县| 七台河市| 天全县| 永仁县| 阳曲县| 基隆市| 临邑县| 西昌市| 陇川县| 车致| 寿宁县| 九江县| 临清市| 巢湖市| 梓潼县| 周口市| 平乡县| 九龙城区| 阜新市| 和林格尔县| 册亨县| 罗源县| 满洲里市| 宁国市| 水城县| 乐陵市| 望江县| 西城区| 汉源县| 宜兰县| 大田县| 大渡口区| 永平县| 曲阳县| 文山县| 大洼县| 麻江县| 伊通| 布尔津县| 从化市| 铁岭县|