AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Java并發(fā):如何避免死鎖

來源: 責(zé)編: 時(shí)間:2024-04-02 17:12:06 181觀看
導(dǎo)讀一般在Java項(xiàng)目里用到鎖的場景不多,有朋友調(diào)侃說用到鎖的次數(shù)還沒有面試被問到的次數(shù)多,哈哈!1.死鎖如何產(chǎn)生說句難聽話,鎖一般都很少用到,何況死鎖呢?想產(chǎn)生死鎖還是有點(diǎn)難的,需要滿足2個(gè)條件:共享資源同時(shí)只能被一個(gè)線程使

一般在Java項(xiàng)目里用到鎖的場景不多,有朋友調(diào)侃說用到鎖的次數(shù)還沒有面試被問到的次數(shù)多,哈哈!wJ328資訊網(wǎng)——每日最新資訊28at.com

wJ328資訊網(wǎng)——每日最新資訊28at.com

1.死鎖如何產(chǎn)生

說句難聽話,鎖一般都很少用到,何況死鎖呢?想產(chǎn)生死鎖還是有點(diǎn)難的,需要滿足2個(gè)條件:wJ328資訊網(wǎng)——每日最新資訊28at.com

共享資源同時(shí)只能被一個(gè)線程使用,如果已經(jīng)有一個(gè)線程占用了資源,其余線程只能等待,直到資源被釋放。wJ328資訊網(wǎng)——每日最新資訊28at.com

死鎖情況肯定存在多個(gè)資源被多個(gè)線程爭搶的情況。wJ328資訊網(wǎng)——每日最新資訊28at.com

比如線程1持有了資源A,然后去等待獲取資源B,線程2持有了資源B,然后等待獲取資源A,這樣就會(huì)形成死鎖。wJ328資訊網(wǎng)——每日最新資訊28at.com

2.如何避免死鎖

一般有2種方式避免死鎖:wJ328資訊網(wǎng)——每日最新資訊28at.com

  • 線程一次性獲取需要的全部資源。
  • 獲取鎖時(shí),增加超時(shí)動(dòng)作。如果在一定的時(shí)間內(nèi)獲取不到鎖,則釋放已經(jīng)獲取的鎖。

3.代碼實(shí)踐

/** * 避免死鎖,我覺得有2種方式: * 1、線程直接一把頭獲取所需要的全部鎖,不要分步 * 2、線程獲取A之后,再去獲取B,超時(shí)仍未獲取到B,則釋放A */public class AvoidDeadLock01 {    private static Lock lock1 = new ReentrantLock();    private static Lock lock2 = new ReentrantLock();    public static void acquireLocks(Lock lock1, Lock lock2) {        boolean isLock1Acquired = false;        boolean isLock2Acquired = false;        while (true) {            try {                isLock1Acquired = lock1.tryLock();                isLock2Acquired = lock2.tryLock();            } finally {                if (isLock1Acquired && isLock2Acquired) {                    return;                }                if (isLock1Acquired) {                    lock1.unlock();                }                if (isLock2Acquired) {                    lock2.unlock();                }            }            try {                Thread.sleep(100);            } catch (InterruptedException e) {                throw new RuntimeException(e);            }        }    }    public static void main(String[] args) {        Thread thread1 = new Thread(() -> {            acquireLocks(lock1, lock2);            System.out.println("=====線程1 獲取到了2把鎖=====");            lock1.unlock();            lock2.unlock();        });        Thread thread2 = new Thread(() -> {            acquireLocks(lock1, lock2);            System.out.println("=====線程2 獲取到了2把鎖=====");            lock1.unlock();            lock2.unlock();        });        thread1.start();        thread2.start();    }}
public class AvoidDeadLock02 {    private static Lock lock1 = new ReentrantLock();    private static Lock lock2 = new ReentrantLock();    public static void acquireLocks(Lock lock1, Lock lock2) {        boolean isLock1Acquired = false;        boolean isLock2Acquired = false;        try {            while (true) {                isLock1Acquired = lock1.tryLock(200, TimeUnit.MILLISECONDS);                if (isLock1Acquired) {                    isLock2Acquired = lock2.tryLock(200, TimeUnit.MILLISECONDS);                    if (isLock2Acquired) {                        break;                    } else {                        lock1.unlock();                    }                }            }        } catch (InterruptedException e) {            Thread.currentThread().interrupt();        } finally {            if (!isLock1Acquired || !isLock2Acquired) {                if (isLock1Acquired) {                    lock1.unlock();                }                if (isLock2Acquired) {                    lock2.unlock();                }            }        }    }    public static void main(String[] args) {        Thread thread1 = new Thread(() -> {            acquireLocks(lock1, lock2);            System.out.println("=====線程1 獲取到了2把鎖=====");            lock1.unlock();            lock2.unlock();        });        Thread thread2 = new Thread(() -> {            acquireLocks(lock1, lock2);            System.out.println("=====線程2 獲取到了2把鎖=====");            lock1.unlock();            lock2.unlock();        });        thread1.start();        thread2.start();    }}

4.出現(xiàn)死鎖如何排查

一般出現(xiàn)死鎖時(shí),可能會(huì)導(dǎo)致CPU、內(nèi)存等資源消耗過高,導(dǎo)致系統(tǒng)性能下降。也可能導(dǎo)致應(yīng)用無響應(yīng)或者假死等等,所以要從多角度進(jìn)行死鎖的排查。wJ328資訊網(wǎng)——每日最新資訊28at.com

首先是用top、df、free等命令查看操作系統(tǒng)的基本情況。然后可以使用jmap、jstack等命令查看JVM線程棧和堆內(nèi)存的情況。一般出現(xiàn)死鎖時(shí),會(huì)在線程棧的信息里出現(xiàn)deadlock字樣。wJ328資訊網(wǎng)——每日最新資訊28at.com

還可以采用VisualVM、JConsole等工具進(jìn)行排查。wJ328資訊網(wǎng)——每日最新資訊28at.com

wJ328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-80818-0.htmlJava并發(fā):如何避免死鎖

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 構(gòu)建企業(yè)級微服務(wù)平臺:實(shí)現(xiàn)可擴(kuò)展性、彈性和高效性

下一篇: 這些CSS特性,我知道, 但是 You don't

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來看看 Node.js 最新的生
  • 三言兩語說透設(shè)計(jì)模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計(jì)模式,它所創(chuàng)建的對象只有一個(gè)實(shí)例,且該實(shí)例易于被外界訪問。單例對象由于只有一個(gè)實(shí)例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個(gè)數(shù)字。例如,一個(gè)擁有三個(gè)或更多子項(xiàng)的grid。你可能會(huì)想,為什么需要這樣做呢?在某些情況下,一個(gè)組件或一個(gè)布局可能會(huì)
  • 自動(dòng)化在DevOps中的力量:簡化軟件開發(fā)和交付

    自動(dòng)化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動(dòng)化工具和方法,DevOps團(tuán)隊(duì)可以實(shí)現(xiàn)以下目標(biāo):消除手動(dòng)和重復(fù)性任務(wù)。簡化流程。在整個(gè)軟件開發(fā)生命周期中實(shí)現(xiàn)更
  • 微軟邀請 Microsoft 365 商業(yè)用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請用戶通過該應(yīng)用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是“環(huán)境保
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報(bào)道稱,近期淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,涉及員工績效、層級體系等多個(gè)核心事項(xiàng),目前已形成一個(gè)初步的“征求意見版”:1、取消P序列
  • 造車兩年股價(jià)跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個(gè)交易日起持有小米集團(tuán)的股票,那么截至2023年上半年最后一個(gè)交易日,投資者將浮虧59.16%,同區(qū)間的恒生科技指數(shù)跌幅為52.78%
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數(shù)亮相,而下半年即將推出的頂級旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
Top