久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

史上最通俗理解的Java死鎖代碼演示

瀏覽:56日期:2022-08-24 16:51:21

死鎖的概念

知識(shí)儲(chǔ)備

對(duì)象鎖:Java一切皆對(duì)象,每個(gè)類都有一個(gè)class文件。由class文件可以new出對(duì)象,我們簡(jiǎn)單認(rèn)識(shí) 下java對(duì)象,對(duì)象有個(gè)對(duì)象頭信息,也就是這個(gè)對(duì)象概述,其中一條信息就是對(duì)象鎖,也就是我們當(dāng)前對(duì)象有沒(méi)有被鎖定,被哪個(gè)引用鎖定。

synchronized:synchronized是java關(guān)鍵詞,如果運(yùn)用到方法上代表我們鎖的是這個(gè)方法,如果我們鎖的代碼塊,代表再這個(gè)代碼塊內(nèi)我們持有這個(gè)鎖,Java Effective也是提倡減小鎖的范圍。我們進(jìn)入同步代碼塊會(huì)加鎖,執(zhí)行完同步代碼塊會(huì)釋放鎖。

死鎖:通俗理解為死掉的鎖。如果沒(méi)有死掉的鎖它的聲明周期是:持有鎖->釋放鎖。死后我們可以理解為持有鎖但是不釋放鎖,也就是我們同步代碼塊沒(méi)有執(zhí)行完?我們只需要分析同步代碼塊的哪里沒(méi)有執(zhí)行就好了,看下面一個(gè)例子

演示死鎖

package com.yang.kuangTeacher;import java.util.concurrent.TimeUnit;/** * @author: fudy * @date: 2020/9/13 下午 12:21 * @Decription: 演示死鎖(內(nèi)容參考B站狂神說(shuō)JAVA) **/public class DeadLock { public static void main(String[] args) { MarkUp markUp0 = new MarkUp('迪麗熱巴',0); MarkUp markUp1 = new MarkUp('楊冪',1); markUp0.start(); markUp1.start(); }}// 口紅類class LipStick {}// 鏡子類class Mirror {}// 化妝類class MarkUp extends Thread { private int choice; private String userName; private static LipStick lipStick = new LipStick(); private static Mirror mirror = new Mirror(); MarkUp(String userName, int choice) { this.userName = userName; this.choice = choice; } @Override public void run() { try { markUP(); } catch (InterruptedException e) { e.printStackTrace(); } } private void markUP() throws InterruptedException { // 如果選擇0方式化妝 if (choice == 0) { // 同步代碼塊的鎖,在同步代碼塊有效 synchronized (lipStick) { System.out.println(userName + '拿到了口紅'); // 拿到口紅后再拿鏡子 TimeUnit.SECONDS.sleep(1); // 程序執(zhí)行此處會(huì)停止 -----------------這里死鎖-----------------------> synchronized (mirror) { System.out.println(userName + '拿到了鏡子'); } } } // 如果選擇1方式化妝 if (choice == 1) { // 同步代碼塊的鎖,在同步代碼塊有效 synchronized (mirror) { System.out.println(userName + '拿到了鏡子'); // 拿到鏡子后再拿口紅 TimeUnit.SECONDS.sleep(1); // 程序執(zhí)行此處會(huì)停止 -----------------這里死鎖-----------------------> synchronized (lipStick) { System.out.println(userName + '拿到了口紅'); } } } }}

我們剛才認(rèn)為,死鎖是由于同步代碼塊沒(méi)有執(zhí)行完,導(dǎo)致不會(huì)釋放鎖,我們分析以上兩個(gè)死鎖的原因。

在線程1方式0化妝中由于我們拿到了口紅鎖后,睡眠一秒鐘(有可能先執(zhí)行線程2) 在線程2方式1化妝中由于我們拿到了鏡子鎖后,睡眠一秒鐘

假如線程1先獲得口紅鎖執(zhí)行完畢,準(zhǔn)備拿鏡子鎖時(shí),發(fā)現(xiàn)鏡子對(duì)象被持有了,所以他會(huì)等待鏡子鎖被釋放。

線程2先執(zhí)行獲得鏡子鎖完畢,準(zhǔn)備拿口紅鎖時(shí),發(fā)現(xiàn)口紅對(duì)象被持有了,所以他會(huì)等待口紅鎖被釋放。

如果我們不關(guān)閉程序,兩個(gè)線程會(huì)一直等待下去。我們可以理解為死鎖,無(wú)法釋放鎖。

解決死鎖

在上述例子中,我們因?yàn)橄胪瑫r(shí)拿到兩個(gè)鎖去做一件事情才會(huì)導(dǎo)致死鎖,按照J(rèn)ava Effective提倡減小鎖的范圍,我們對(duì)問(wèn)題進(jìn)行改進(jìn)。

我們可以拿到口紅鎖后執(zhí)行口紅方法后釋放口紅鎖,想要鏡子鎖再同步代碼塊拿鏡子鎖即可。

package com.yang.kuangTeacher;import java.util.concurrent.TimeUnit;/** * @author: fudy * @date: 2020/9/13 下午 12:21 * @Decription: 演示死鎖(內(nèi)容參考B站狂神說(shuō)JAVA) **/public class DeadLock { public static void main(String[] args) { MarkUp markUp0 = new MarkUp('迪麗熱巴',0); MarkUp markUp1 = new MarkUp('楊冪',1); markUp0.start(); markUp1.start(); }}// 口紅類class LipStick {}// 鏡子類class Mirror {}// 化妝類class MarkUp extends Thread { private int choice; private String userName; private static LipStick lipStick = new LipStick(); private static Mirror mirror = new Mirror(); MarkUp(String userName, int choice) { this.userName = userName; this.choice = choice; } @Override public void run() { try { markUP(); } catch (InterruptedException e) { e.printStackTrace(); } } private void markUP() throws InterruptedException { // 如果選擇0方式化妝 if (choice == 0) { // 同步代碼塊的鎖,在同步代碼塊有效 synchronized (lipStick) { System.out.println(userName + '拿到了口紅'); TimeUnit.SECONDS.sleep(1); } // 拿到口紅后再拿鏡子 ------------------------改進(jìn)--------------------------- synchronized (mirror) { System.out.println(userName + '拿到了鏡子'); } } // 如果選擇1方式化妝 if (choice == 1) { // 同步代碼塊的鎖,在同步代碼塊有效 synchronized (mirror) { System.out.println(userName + '拿到了鏡子'); TimeUnit.SECONDS.sleep(1); } // 拿到鏡子后再拿口紅 ------------------------改進(jìn)--------------------------- synchronized (lipStick) { System.out.println(userName + '拿到了口紅'); } } }}

通過(guò)及時(shí)釋放鎖,也就是縮小同步代碼塊的范圍,我們使用鎖結(jié)束后及時(shí)釋放,這樣是一種解決死鎖的方式,通過(guò)這個(gè)例子我們以后編寫代碼就會(huì)警惕鎖的同步代碼的范圍。

總結(jié)

到此這篇關(guān)于Java死鎖代碼演示的文章就介紹到這了,更多相關(guān)Java死鎖代碼演示內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 泸定县| 康定县| 太康县| 民县| 朝阳县| 荆州市| 桂林市| 通江县| 白玉县| 濮阳市| 望城县| 西青区| 阿鲁科尔沁旗| 汝阳县| 保定市| 汕头市| 伊吾县| 田林县| 门头沟区| 樟树市| 嘉义县| 襄樊市| 阳西县| 华坪县| 马公市| 周至县| 肃南| 鄂尔多斯市| 澄江县| 昌吉市| 台南县| 乐亭县| 定襄县| 邢台县| 镇雄县| 平江县| 乐清市| 米脂县| 新田县| 静海县| 周口市|