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

java并發(fā)編程死鎖定義及如何避免死鎖

 更新時(shí)間:2022年02月09日 10:47:42   作者:Alpinist?Wang  
這篇文章主要為大家介紹了java并發(fā)編程中死鎖的詳細(xì)說明及如何避免死鎖的方法,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步

場景模擬分析

場景一:狹路相逢

在星期天的早上十點(diǎn)半,你在公路上開著車,這是一條窄路,只能容納一輛車。這時(shí),迎面又駛來一輛車,你們都走到一半,誰也不想倒回去,于是各不相讓。陷入無盡的等待。

場景二:冷戰(zhàn)

你和她吵架了,誰也不理誰,甚至晚飯時(shí)間都各自煮飯。你在炒京醬肉絲,她在做蔥烤鯽魚。炒到一半你發(fā)現(xiàn)小蔥被她全部拿走了,于是你默默等待她做好菜后再去拿。殊不知她也在等待你炒完菜后來拿醬油。

場景三:哲學(xué)家就餐

你和四個(gè)好朋友坐在圓形餐桌旁,你們只做兩件事情:吃飯,或者思考。吃飯的時(shí)候,你們就停止思考。思考的時(shí)候,也停止吃飯。每個(gè)人面前有一碗蘭州炒飯。并且每個(gè)人左右兩邊各有一根筷子。你們必須要拿到兩根筷子才能開始吃飯。吃完后再放下筷子,讓別人可以使用。吃了一會(huì)之后,每個(gè)人都拿起了自己左手邊的筷子,導(dǎo)致每個(gè)人都只有一根筷子,并且等待別人吃完放下筷子給自己??上?,沒有人吃到飯,所以沒有人會(huì)放下筷子。(著名的哲學(xué)家就餐問題)

場景四:競爭資源

你有兩個(gè)線程 A 和 B ,各自在加鎖的狀態(tài)下運(yùn)行。 A 持有一部分資源,并且等待 B 線程中的資源以完成自己的工作,而此時(shí) B 線程也在等待 A 中的資源以完成自己的工作。由于他們都是鎖定狀態(tài),所以他們必須完成了自己的工作后,自己持有的資源才能釋放。于是線程無休止的等待,導(dǎo)致死鎖。

死鎖是什么?

上述四個(gè)場景都是程序員在工作或生活中會(huì)遇到的問題,人生就像是一個(gè)進(jìn)程,時(shí)間是我們的主線程,期間做的每一件事都是開啟的一個(gè)子線程。當(dāng)多件事沖突時(shí),并發(fā)問題就產(chǎn)生了。以上場景都指向同一類并發(fā)問題:死鎖。

當(dāng)兩個(gè)以上的運(yùn)算單元,雙方都在等待對方停止運(yùn)行,以獲取系統(tǒng)資源,但是沒有一方提前退出時(shí),就稱為死鎖。

產(chǎn)生死鎖的的四個(gè)條件如下:

1、互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用;

2、請求與保持條件:一個(gè)進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放;

3、不剝奪條件:進(jìn)程已獲得的資源,在沒使用完之前,不能強(qiáng)行剝奪;

4、循環(huán)等待條件:多個(gè)進(jìn)程之間形成一種互相循環(huán)等待資源的關(guān)系。

并發(fā)帶來壓力,有的人或有的程序,會(huì)因?yàn)槌惺懿蛔毫Χ罎?,情緒崩潰和程序崩潰沒什么兩樣。當(dāng)然,不論是做人還是寫程序,面對問題時(shí),正確的做法都應(yīng)是采取策略,解除死鎖。

如何避免死鎖?

死鎖一旦發(fā)生,便無法解除。我們能做的只能盡量避免死鎖。要避免死鎖,只需破壞產(chǎn)生死鎖的四個(gè)條件之一即可。

方案一:破壞不剝奪條件

你想起書中所言:退一步海闊天空。但你也深知公平好過忍讓。正值周賽時(shí)間,你搖下車窗,對對面的兄弟喊道:咱來比賽一場力扣周賽,誰輸了誰倒出去讓另一個(gè)人過吧!于是你們打開力扣,開始答題。半小時(shí)后,你憑借高超的代碼水平 AC 了全部題目。對面司機(jī)對你拱手道:技不如人,甘拜下風(fēng)。于是他倒了回去,讓出了自己的一半路。最終你們都得以順利通行。

破壞不剝奪條件:讓對面的司機(jī)放棄了自己已有的資源。

方案二:破壞請求與保持條件

你在炒菜時(shí)發(fā)現(xiàn)沒有小蔥,于是你換位思考,想到她會(huì)不會(huì)也缺少自己用著的材料。雖然她還在和你冷戰(zhàn),但你勸解自己一個(gè)大老爺們不應(yīng)該和女孩子置氣,于是你主動(dòng)把自己用著的所有材料拿給了她。她感受到你設(shè)身處地為她著想,大為感動(dòng),你們和好如初。之后她為你們兩個(gè)人一起炒了京醬肉絲和蔥烤鯽魚。

破壞請求與保持條件:在自己需要的材料缺少時(shí),主動(dòng)放棄自己持有的資源,防止出現(xiàn)互相等待。

方案三:破壞循環(huán)等待條件

你和你的朋友們決定給筷子編上號:1~5。規(guī)定每個(gè)人拿筷子時(shí)必須先拿到自己兩邊的筷子中號碼小的那一根,再去拿號碼大的那一根。如果小的那一根沒有拿到,不能先拿大的。當(dāng)你們開始吃飯時(shí),由于數(shù)字 5 不可能被一個(gè)人單獨(dú)拿到。因?yàn)樗赃叺牧硪桓曜泳幪柋囟ū?5 小,所以不會(huì)再出現(xiàn)每個(gè)人都拿著一根的無限等待情形。

破壞循環(huán)等待條件:由于筷子指定了編號和獲取規(guī)則,所以每個(gè)鎖定狀態(tài)都將按照順序執(zhí)行,于是便杜絕了環(huán)路等待條件。

方案四:破壞互斥條件

你在運(yùn)行兩個(gè)線程前,預(yù)先將線程 A 和 B 中的資源拷貝一份,讓他們不需互相等待對方的資源,于是兩個(gè)線程都得以順利運(yùn)行。

破壞互斥條件:由于每次使用時(shí)都拷貝一份,所以一個(gè)資源可以被多個(gè)進(jìn)程使用。

以上就是java并發(fā)編程死鎖定義及如何避免死鎖的詳細(xì)內(nèi)容,更多關(guān)于java死鎖及避免的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot中HTTP請求不通的原因級解決方法

    SpringBoot中HTTP請求不通的原因級解決方法

    HTTP 請求是指從客戶端到服務(wù)器的請求消息,對于一個(gè) Spring Boot 項(xiàng)目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會(huì)遇到SpringBoot HTTP請求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下
    2025-02-02
  • Spring?Boot?根據(jù)配置決定服務(wù)(集群、單機(jī))是否使用某些主件的操作代碼

    Spring?Boot?根據(jù)配置決定服務(wù)(集群、單機(jī))是否使用某些主件的操作代碼

    這篇文章主要介紹了Spring?Boot根據(jù)配置決定服務(wù)(集群、單機(jī))是否使用某些主件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • 教你怎么用Java獲取國家法定節(jié)假日

    教你怎么用Java獲取國家法定節(jié)假日

    這篇文章主要介紹了教你怎么用Java獲取國家法定節(jié)假日,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 解析ConcurrentHashMap:成員屬性、內(nèi)部類、構(gòu)造方法

    解析ConcurrentHashMap:成員屬性、內(nèi)部類、構(gòu)造方法

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)

    javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)

    這篇文章主要針對javaweb商城項(xiàng)目開發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對象,感興趣的小伙伴們可以參考一下
    2016-02-02
  • springboot加載不到nacos配置中心的配置問題處理

    springboot加載不到nacos配置中心的配置問題處理

    這篇文章主要介紹了springboot加載不到nacos配置中心的配置問題處理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • eclipse+myeclipse 環(huán)境配置方法

    eclipse+myeclipse 環(huán)境配置方法

    eclipse+myeclipse配置環(huán)境
    2009-07-07
  • 詳解slf4j+logback在java工程中的配置

    詳解slf4j+logback在java工程中的配置

    這篇文章主要介紹了slf4j+logback在java工程中的配置,對日志組件logback也進(jìn)行了簡單介紹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • Spring注解之Service用法及示例詳解

    Spring注解之Service用法及示例詳解

    使用 @Service 注解可以將一個(gè)類聲明為業(yè)務(wù)邏輯組件,并將其對象存入 Spring 容器中,在控制器類中,通過注入該組件的實(shí)例,即可調(diào)用其中的方法,這篇文章主要介紹了Spring注解之Service用法及示例詳解,需要的朋友可以參考下
    2024-04-04
  • JUnit單元測試入門必看篇

    JUnit單元測試入門必看篇

    下面小編就為大家分享一篇JUnit單元測試入門必看篇,對新手而言有很好的參考價(jià)值,希望對大家有所幫助
    2017-11-11

最新評論

东方市| 和静县| 观塘区| 铁岭市| 沂源县| 呼和浩特市| 丰镇市| 台南县| 神农架林区| 彩票| 平江县| 岚皋县| 孟津县| 镇康县| 郯城县| 伽师县| 高要市| 通海县| 凉城县| 大厂| 台北县| 山东| 上杭县| 新密市| 桓台县| 苍南县| 池州市| 西乌珠穆沁旗| 永川市| 彰武县| 青河县| 雅江县| 广昌县| 图们市| 石嘴山市| 辽源市| 临武县| 岢岚县| 项城市| 凌源市| 夏津县|