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

Java線程死鎖的問題解決

 更新時(shí)間:2026年03月19日 09:28:30   作者:ZePingPingZe  
本文主要介紹了Java線程死鎖的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 死鎖案例

死鎖:線程之間互相持有對(duì)方的鎖,并且等待獲取對(duì)方持有的鎖。

案例如下:我這里直接寫的service層代碼,沒寫測(cè)試類(測(cè)試類直接調(diào)用deadLockTest()方法)。

package cn.sh.tools.service.component.lock;
 
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CountDownLatch;
 
/**
 * @Description
 * @Classname LockComponent
 * @Date 2023/4/28
 * @Author sh
 **/
@Component
@Slf4j
public class LockComponent {
 
    // 記得在 yml文件中配置線程池相關(guān)參數(shù)(核心線程數(shù)、工作隊(duì)列大小、最大線程數(shù))。
    @Resource(name = "applicationTaskExecutor")
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
    // 入?yún)reateThreadNum:要?jiǎng)?chuàng)建的線程數(shù)。盡量設(shè)置個(gè)十幾二十個(gè),設(shè)置的太小可能程序執(zhí)行太快就發(fā)生不了死鎖。
    public void deadlockTest(int createThreadNum) {
        // 計(jì)數(shù)器
        CountDownLatch sunCdl = new CountDownLatch(createThreadNum);
        // 1- 填充數(shù)據(jù)
        List<DeadLockObj> deadLockObjList = new ArrayList<>(createThreadNum);
        /**
         * for循環(huán) 創(chuàng)建DeadLockObj對(duì)象,這里只創(chuàng)建了兩種對(duì)象。
         * 這里創(chuàng)建兩種對(duì)象的原因是為了 后面創(chuàng)建的線程互相持有鎖。
         */
        for (int i = 0; i < createThreadNum; i++) {
            if (i % 2 != 0) {
                // i 為 奇數(shù)時(shí),給 DeadLockObj 對(duì)象的 a = 1,b = 2。
                deadLockObjList.add(new DeadLockObj(i, 1, 2));
            } else {
                // i 為 偶數(shù)時(shí),給 DeadLockObj 對(duì)象的 a = 2,b = 1。
                deadLockObjList.add(new DeadLockObj(i, 2, 1));
            }
        }
        deadLockObjList.sort(Comparator.comparingInt(DeadLockObj::getId));
 
        // 循環(huán)數(shù)據(jù),調(diào)用 deadLockInternal()方法,展示死鎖情況。
        deadLockObjList.forEach(deadLockObj -> {
            this.threadPoolTaskExecutor.execute(() -> {
                try {
                    sunCdl.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
 
                // 在高并發(fā)情況下,必然會(huì)出現(xiàn)死鎖。
                this.deadLockInternal(deadLockObj);
            });
        });
 
        // 循環(huán)將 計(jì)數(shù)器 減1,當(dāng)減為0時(shí),上面的線程就開始 真正的并發(fā)執(zhí)行。
        for (int i = 0; i < createThreadNum; i++) {
            sunCdl.countDown();
        }
    }
 
    private void deadLockInternal(DeadLockObj deadLockObj) {
        /**
         * ① 線程A 持有 Integer.valueOf(1),線程B 持有 Integer.valueOf(2)
         * ② 線程A 搶占 Integer.valueOf(2),但是2被線程B持有。
         *   同時(shí),線程B 搶占 Integer.valueOf(1),但是1被線程A持有。
         * 線程A 和 線程B 要搶占的鎖都被對(duì)方持有,所以,必然會(huì)出現(xiàn)死鎖。
         */
 
        // 第一把鎖
        synchronized (Integer.valueOf(deadLockObj.getA())) {
            // 第二把鎖
            synchronized (Integer.valueOf(deadLockObj.getB())) {
                System.out.println(deadLockObj.getId());
            }
        }
    }
 
    @Getter
    @AllArgsConstructor
    static class DeadLockObj {
        Integer id;
        int a;
        int b;
    }
 
}

2. 死鎖線程查看

2.1 第一步

當(dāng) java程序發(fā)生死鎖時(shí),JavaVisualVM 的 "線程"標(biāo)簽頁 會(huì)自動(dòng)顯示紅色提示信息:“檢測(cè)到死鎖!生成一個(gè)線程dump以獲取更多信息”。如下圖所示:

JavaVisualVM 不能很方便的查看到到底是哪幾個(gè)線程發(fā)生了死鎖,所以,接下來我們就可以用到 JConsole了。

【備注】:JavaVisualVM 在JDK8的時(shí)候還是自帶工具,到JDK11的時(shí)候就不是自帶的了,但還是可以免費(fèi)下載和免費(fèi)試用的。(至于JDK9、10有沒有自帶不知道,沒下載過)。

2.2 第二步

上面一步,JavaVisualVM 已經(jīng)【自動(dòng)】給我們提示出現(xiàn)了【死鎖】。這里,我們就可以用 JConsole 來查看了。

死鎖 小標(biāo)簽頁,我們隨便點(diǎn)擊一個(gè)線程就可以查看對(duì)應(yīng)的 線程快照信息。

到此這篇關(guān)于Java線程死鎖的問題解決的文章就介紹到這了,更多相關(guān)Java線程死鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

忻城县| 深圳市| 鸡东县| 龙泉市| 县级市| 偃师市| 台江县| 格尔木市| 乐平市| 南安市| 通化市| 定州市| 红桥区| 万山特区| 迁安市| 华宁县| 泰和县| 门头沟区| 谢通门县| 湟中县| 梓潼县| 余姚市| 宁城县| 华蓥市| 黑河市| 壤塘县| 乡宁县| 监利县| 乌苏市| 嵊泗县| 射洪县| 固阳县| 福州市| 西充县| 称多县| 锦州市| 尖扎县| 承德市| 桂东县| 马关县| 江永县|