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

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

Java死鎖,你學(xué)會(huì)了嗎?

來(lái)源: 責(zé)編: 時(shí)間:2024-01-19 09:16:24 228觀看
導(dǎo)讀死鎖死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,他們都無(wú)法推進(jìn)下去。通俗一點(diǎn)就是兩個(gè)進(jìn)程都持有資源,但是又想搶對(duì)方的資源,互不相讓了。圖片死鎖的問(wèn)

死鎖

死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,他們都無(wú)法推進(jìn)下去。通俗一點(diǎn)就是兩個(gè)進(jìn)程都持有資源,但是又想搶對(duì)方的資源,互不相讓了。ODP28資訊網(wǎng)——每日最新資訊28at.com

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

死鎖的問(wèn)題和其他的并發(fā)安全問(wèn)題一樣,是概率性的,也就是說(shuō),即使存在發(fā)生死鎖的可能性,也并不是 100% 會(huì)發(fā)生的。如果每個(gè)鎖的持有時(shí)間很短,那么發(fā)生沖突的概率就很低,所以死鎖發(fā)生的概率也很低。可能每天有幾千萬(wàn)次的“獲取鎖”、“釋放鎖”操作,在巨量的次數(shù)面前,整個(gè)系統(tǒng)發(fā)生問(wèn)題的幾率就會(huì)被放大。ODP28資訊網(wǎng)——每日最新資訊28at.com

必然死鎖例子

public static void main(String[] args) {    //2個(gè)對(duì)象2把鎖    //創(chuàng)建2個(gè)線程,首先獲取自己的對(duì)象鎖,確保獲取了鎖,然后去獲取對(duì)方的鎖    final Object o1 = new Object();    final Object o2 = new Object();    Thread thread1 = new Thread(new Runnable() {        @Override        public void run() {            synchronized (o1) {                System.out.println("thread1獲取了o1對(duì)象的鎖");                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("thread1等待o2鎖釋放...");                synchronized (o2) {                    System.out.println("thread1獲取了o2對(duì)象的鎖");                }            }        }    });    Thread thread2 = new Thread(new Runnable() {        @Override        public void run() {            synchronized (o2) {                System.out.println("thread2獲取了o2對(duì)象的鎖");                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("thread2等待o1鎖釋放...");                synchronized (o1) {                    System.out.println("thread2獲取了o1對(duì)象的鎖");                }            }        }    });    thread1.start();    thread2.start();}

運(yùn)行結(jié)果:ODP28資訊網(wǎng)——每日最新資訊28at.com

thread1獲取了o1對(duì)象的鎖thread2獲取了o2對(duì)象的鎖thread2等待o1鎖釋放...thread1等待o2鎖釋放...

可見線程一先上了o1鎖,線程二先上了o2鎖,然后線程一需要等待線程二的o2鎖釋放獲取到該鎖執(zhí)行完后續(xù)代碼才能釋放o1鎖,但線程二也需要等待線程一的o1鎖釋放獲取到該鎖執(zhí)行完后續(xù)代碼才能釋放o2鎖。他倆就互相等待,鎖死了。ODP28資訊網(wǎng)——每日最新資訊28at.com

死鎖必要條件

  • 互斥:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
  • 請(qǐng)求與保持:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
  • 不剝奪:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
  • 循環(huán)等待:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

避免死鎖

加鎖順序(線程按照一定的順序加鎖,規(guī)定獲取資源需要按照一定順序)
加鎖時(shí)限(線程嘗試獲取鎖的時(shí)候加上一定的時(shí)限,超過(guò)時(shí)限則放棄對(duì)該鎖的請(qǐng)求,并釋放自己占有的鎖;第二,可以用Lock中tryLock,嘗試拿鎖,拿不到不會(huì)持續(xù)等待)
死鎖檢測(cè)ODP28資訊網(wǎng)——每日最新資訊28at.com


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

本文鏈接:http://www.www897cc.com/showinfo-26-64968-0.htmlJava死鎖,你學(xué)會(huì)了嗎?

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

上一篇: StringBuilder 為什么線程不安全?

下一篇: 為了讓小白也能看懂這個(gè)死鎖Case,我請(qǐng)來(lái)了小黑...

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 大埔县| 武隆县| 潍坊市| 宜丰县| 织金县| 莫力| 乌鲁木齐县| 武鸣县| 茂名市| 泰安市| 砚山县| 丰城市| 汉源县| 寿阳县| 会同县| 晋城| 文昌市| 年辖:市辖区| 韩城市| 张北县| 巨野县| 济源市| 平安县| 体育| 烟台市| 城口县| 乃东县| 平定县| 仙游县| 双流县| 全椒县| 常德市| 彭州市| 普兰店市| 东至县| 黄平县| 黄梅县| 奇台县| 开封县| 苍梧县| 图木舒克市|