日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于java中死锁的总结

發布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于java中死锁的总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于死鎖,估計很多程序員都碰到過,并且有時候這種情況出現之后的問題也不是非常好排查,下面整理的就是自己對死鎖的認識,以及通過一個簡單的例子來來接死鎖的發生,自己是做python開發的,但是對于死鎖的理解一直是一種模糊的概念,也是想過這次的整理更加清晰的認識這個概念。


用來理解的例子是一個簡單的生產者和消費者模型,這里是有一個生產者,有兩個消費者,并且注意代碼中使用notify方法的代碼行

package study_java.ex11;import java.util.LinkedList; import java.util.List;public class PCDemo1 {public static void main(String[] args){Pool pool = new Pool();Producter p1 = new Producter(pool);p1.setName("p1");Consumer c1 = new Consumer(pool);Consumer c2 = new Consumer(pool);c1.setName("c1");c2.setName("c2");p1.start();c1.start();c2.start();} }class Pool{private List<Integer> list = new LinkedList<Integer>();private int Max = 1;public void addLast(int n){String name = Thread.currentThread().getName();synchronized (this){while (list.size() >= Max){try{System.out.println(name+".wait()");this.wait();}catch (Exception e){e.printStackTrace();}}System.out.println(name + "+" + n);list.add(new Integer(n));System.out.println(name + ".notify()");this.notify(); // 注意這里是調用的是notify方法 }}public int remove(){String name = Thread.currentThread().getName();synchronized (this){while (list.size() == 0){try{System.out.println(name + ".wait()");this.wait();}catch (Exception e){e.printStackTrace();}}System.out.println(name + "-" + 0);int no = list.remove(0);System.out.println(name + ".notify()");this.notify(); // 注意這里是調用的是notify方法return no;}}}// 生產者 class Producter extends Thread{private Pool pool;static int i = 1;public Producter(Pool pool){this.pool = pool;}public void run(){while (true){pool.addLast(i++);System.out.println("生產者生產了"+i+"號");}}}// 消費者 class Consumer extends Thread{private Pool pool;public Consumer(Pool pool){this.pool = pool;}public void run(){while (true){int no = pool.remove();System.out.println("消費者消費了"+no+"號");}}}

這段代碼的運行效果是日志,在最后程序卡主不動了:

c1.wait() p1+1 p1.notify() c1-0 c1.notify() 消費者消費了1號 c1.wait() 生產者生產了2號 p1+2 p1.notify() c1-0 c1.notify() 消費者消費了2號 c1.wait() 生產者生產了3號 p1+3 p1.notify() c1-0 c1.notify() 消費者消費了3號 c1.wait() 生產者生產了4號 p1+4 p1.notify() c1-0 c1.notify() 消費者消費了4號 c1.wait() 生產者生產了5號 p1+5 p1.notify() c1-0 c1.notify() 消費者消費了5號 c1.wait() 生產者生產了6號 p1+6 p1.notify() 生產者生產了7號 c1-0 c1.notify() 消費者消費了6號 c1.wait() p1+7 p1.notify() 生產者生產了8號 p1.wait() c2-0 c2.notify() 消費者消費了7號 c2.wait() c1.wait() p1+8 p1.notify() 生產者生產了9號 p1.wait() c2-0 c2.notify() 消費者消費了8號 c2.wait() c1.wait()

對上面的出現卡主的情況進行分析,理解為啥會卡主:

從這次的執行效果可以看出第一次是c1搶到了執行權,但是這個時候pool是空
所以c1沒有可以消費的對象,被放入到了等待隊列

接著p1搶到了執行權,生產了1個,然后p1.notify(),這個時候等待隊列里只有c1,所以c1被喚醒,c1消費了1個,然后c1.notify(), 這個時候等待隊列也沒有等待的,這個時候有被c1搶到了執行權,但是pool里沒有可以消費的內容,所以c1.wait() 進入到等待隊列

這個時候p1搶到執行權,生產了1個,然后p1.notify(),這個時候等待隊列里只有c1,所以c1被喚醒,c1也搶到了執行權,消費了1個,然后c1.notify()
同樣這個時候等待隊列里沒有等待的,c1這次又搶到了執行權,但pool里沒有可以消費的內容,所以c1.wait(),進入到等待隊列

p1 又搶到了執行權,生產1個,然后p1.notify(),這個時候等待隊列里只有c1,所以c1被喚醒,c1也搶到了執行權,消費了1個,然后c1.notify()
同樣這個時候等待隊列里沒有等待的,c1這次又搶到了執行權,但pool里沒有可以消費的內容,所以c1.wait(),進入到等待隊列

.......這種情況重復了幾次

但是運行到下面這段的時候問題出現了:

p1+7 p1.notify() 生產者生產了8號 p1.wait() c2-0 c2.notify() 消費者消費了7號 c2.wait() c1.wait() p1+8 p1.notify() 生產者生產了9號 p1.wait() c2-0 c2.notify() 消費者消費了8號 c2.wait() c1.wait()

繼續進行分析,中間重復的部分不做分析了,和前面的過程是一樣的

這個時候等待隊里里依然是c1 這個時候p1搶到了執行權,生產了1個,p1.notify() 這個時候等待隊列里只有c1,所以c1被喚醒,但是c1沒有搶過p1,p1自己又搶到了執行權,但是這個時候pool里面已經有內容,所以p1沒有生產,p1.wait(),p1進入等待隊列

這個時候c2搶到了執行權,c2消費1個,c2.notify() 這個時候等待隊里是p1,p1被喚醒,但是這個時候c2搶到了執行權,但是pool沒有內容可以消費所以c2.wait() 進入等待隊列

接著c1搶到了執行權,同樣pool沒有可以消費的內容,c1.wait() 進入到等待隊列

p1這個時候搶到了執行權,p1生產了1個,接著p1.notify() 這個時候等待隊列里有c1和c2,但是只有一個會被喚醒,不管是哪個,結果沒搶過p1,p1再次拿到執行權,但是這個時候pool已經有內容,所以p1.wait() p1進入等待隊列

從下面是c2執行,可以看出剛才是c2被喚醒了,這個時候c2也拿到了執行權消費了1個。c2.notify() 等待隊列里這個時候有c1 和p1 但是這個時候c2 自己搶到了執行權,但是沒有可以消費的,c2.wait() c2 進入等待隊列
不巧的是剛才搶到執行權的正好是c1,所以c1繼續wait,再次進入等待隊列

到這個時候p1 c1 c2 都進入等待隊列里,都在等待喚醒,也就出現了程勛最后卡住不動的情況

?

解決的方法有兩種:

第一種:
其實解決上面的方法也比較簡單,就是把調用notify的地方全部換成notifyAll方法

notify和notifyAll的區別是,當執行notifyAll的時候會喚醒所有等待的線程,從而避免之前的都在等待隊列等待的問題

第二種:
就是wait()的時候加上超時參數,不是像之前一直傻等,而是在超過既定的時間之后自己喚醒

?

總結

以上是生活随笔為你收集整理的关于java中死锁的总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男女做爰猛烈刺激 | 在线观看黄网 | 少妇高潮久久久 | 中文字幕123区 | 少妇太紧太爽又黄又硬又爽小说 | 亚洲第一看片 | 夏晴子在线 | 男人的天堂视频网站 | 福利小视频 | 亚洲av无码久久精品色欲 | 91亚洲精品在线观看 | 亚洲日批| 99国产精品久久久久久久久久久 | 亚洲伊人久久综合 | 二区三区在线观看 | 操操操日日日 | 色综合啪啪 | 79日本xxxxxxxxx18| 亚洲午夜免费视频 | 日韩精品在线一区二区三区 | 国产黄色片在线 | 粉嫩av网址| 日本一本一道 | 亚洲精品日韩在线 | 国产情侣av在线 | 俄罗斯黄色大片 | 影音先锋在线中文字幕 | 91丨九色丨国产 | 亚洲欧美综合色 | 日韩avav| 五月婷婷色| 国产福利精品在线观看 | 98自拍视频 | 婷婷成人在线 | 欧美亚洲三级 | 亚洲日日日 | 不卡的毛片 | 成人福利视频在线观看 | 欧美成人短视频 | 国产伦乱视频 | 天天摸日日| 亚洲男人天堂2023 | 五月天堂色| 精品免费在线观看 | 女人脱了内裤趴开腿让男躁 | 天天色宗合 | 亚洲欧美国产精品 | 亚洲少妇视频 | 91精品国产高清一区二区三区蜜臀 | 国产精品视频一区二区三区在3 | 久久久综合久久久 | 欧美成人aaaa | 秋霞欧美在线观看 | 影音先锋中文字幕人妻 | 啄木乌欧美一区二区三区 | 特黄大片又粗又大又暴 | 先锋av资源在线 | 亚洲一区二区三区在线免费观看 | 国产精品免费视频一区 | 日本一级一片免费视频 | 国产精品一区二区无码免费看片 | 国产做受高潮动漫 | 爆操av | 欧美透逼视频 | 俄罗斯乱妇| 噜噜色综合 | 色欲狠狠躁天天躁无码中文字幕 | 欧美日韩影院 | 免费网站观看www在线观看 | 视频一区二区三区在线 | 男生尿隔着内裤呲出来视频 | 三级麻豆| 含羞草一区二区三区 | 黄色网址网站 | 国产鲁鲁视频在线观看特色 | 国产成人片 | 日韩精品福利在线 | 校霸被c到爽夹震蛋上课高潮 | av有码在线观看 | 在线观看黄色的网站 | 在线视频欧美日韩 | 无码人妻精品一区二区三 | 日本久久中文字幕 | 91pron在线| 午夜一本| 亚洲成年人在线观看 | 欧美久久久久久久久久久久久久 | 伊人精品| 国产按摩一区二区三区 | 国产日本欧美在线 | 女人性做爰24姿势视频 | 欧美黄片一区二区三区 | 人妻在线一区二区 | 不卡一二区| 激情五月av | 久久在线中文字幕 | 天天干天天草天天射 | 中文精品无码中文字幕无码专区 | 禁漫天堂黄漫画无遮挡观看 |