日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

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

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

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

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

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

2.如何避免死鎖

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

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

3.代碼實(shí)踐

/** * 避免死鎖,我覺(jué)得有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)存等資源消耗過(guò)高,導(dǎo)致系統(tǒng)性能下降。也可能導(dǎo)致應(yīng)用無(wú)響應(yīng)或者假死等等,所以要從多角度進(jìn)行死鎖的排查。eZW28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見(jiàn)的
  • 一加Ace2 Pro真機(jī)揭曉 鈦空灰配色質(zhì)感拉滿

    終于,在經(jīng)過(guò)了幾波預(yù)熱之后,一加Ace2 Pro的外觀真機(jī)圖在網(wǎng)上出現(xiàn)了。還是博主數(shù)碼閑聊站曝光的,這次的外觀設(shè)計(jì)還是延續(xù)了一加11的方案,只是細(xì)節(jié)上有了調(diào)整,例如新加入了鈦空灰
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性?xún)r(jià)比榜之后,我們來(lái)看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來(lái)源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國(guó)內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • K6:面向開(kāi)發(fā)人員的現(xiàn)代負(fù)載測(cè)試工具

    K6 是一個(gè)開(kāi)源負(fù)載測(cè)試工具,可以輕松編寫(xiě)、運(yùn)行和分析性能測(cè)試。它建立在 Go 和 JavaScript 之上,它被設(shè)計(jì)為功能強(qiáng)大、可擴(kuò)展且易于使用。k6 可用于測(cè)試各種應(yīng)用程序,包括 Web
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問(wèn)題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問(wèn)題。雖然我們有個(gè)監(jiān)控頁(yè)面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構(gòu)師或者程序員,你是否曾經(jīng)為公司的系統(tǒng)在面對(duì)高并發(fā)和性能瓶頸時(shí)感到手足無(wú)措或者焦頭爛額呢?筆者在出道那會(huì)為此是吃盡了苦頭的,不過(guò)也得
  • 為什么你不應(yīng)該使用Div作為可點(diǎn)擊元素

    按鈕是為任何網(wǎng)絡(luò)應(yīng)用程序提供交互性的最常見(jiàn)方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過(guò)這樣做,我們錯(cuò)過(guò)了許多內(nèi)置瀏覽器的功能。
  • 微軟發(fā)布Windows 11新版 引入全新任務(wù)欄狀態(tài)

    近日,微軟發(fā)布了Windows 11新版,而B(niǎo)uild 22563更新主要引入了幾周前曝光的平板模式任務(wù)欄等,系統(tǒng)更流暢了。更新中,Windows 11加入了專(zhuān)門(mén)針對(duì)平板優(yōu)化的任務(wù)欄
  • 北京:科技教育體驗(yàn)基地開(kāi)始登記

      北京“科技館之城”科技教育體驗(yàn)基地登記和認(rèn)證工作日前啟動(dòng)。首批北京科技教育體驗(yàn)基地?cái)M于2023年全國(guó)科普日期間掛牌,后續(xù)還將開(kāi)展常態(tài)化登記。  北京科技教育體驗(yàn)基
Top 主站蜘蛛池模板: 明溪县| 辽源市| 玉龙| 南宁市| 南阳市| 上犹县| 白河县| 句容市| 郎溪县| 闵行区| 新绛县| 伊宁县| 莆田市| 子洲县| 松江区| 郁南县| 肥乡县| 保康县| 呼图壁县| 靖宇县| 武陟县| 青田县| 清苑县| 高青县| 红河县| 柳林县| 常德市| 青岛市| 漳浦县| 任丘市| 新平| 双辽市| 胶南市| 福海县| 桦南县| 漯河市| 天全县| 社旗县| 汉川市| 东海县| 富宁县|