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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例

發布時間:2024/3/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.死鎖代碼

//死鎖:多個線程互相抱著對方需要的資源,然后形成僵局 public class DeadLock {public static void main(String[] args) {Makeup girl1 = new Makeup(0,"灰姑娘");Makeup girl2 = new Makeup(1,"白雪公主");girl1.start();girl2.start();}}//口紅 class Lipstick{}//鏡子 class Mirror{}class Makeup extends Thread{//需要的資源只能有一份,用static來保證只有一份static Lipstick lipstick = new Lipstick();static Mirror mirror = new Mirror();int choice;//選擇String girlName;//使用化妝品的人public Makeup(int choice, String girlName) {this.choice = choice;this.girlName = girlName;}@Overridepublic void run(){try {makeup();//化妝} catch (InterruptedException e) {e.printStackTrace();}}private void makeup() throws InterruptedException {if (choice == 0){synchronized (lipstick){//獲得口紅的鎖System.out.println(this.girlName+"獲得口紅的鎖");Thread.sleep(1000);synchronized (mirror){//一秒鐘后想獲得鏡子System.out.println(this.girlName+"獲取鏡子的鎖");}}}else {synchronized (mirror){//獲得鏡子的鎖System.out.println(this.girlName+"獲得鏡子的鎖");Thread.sleep(2000);synchronized (lipstick){//兩秒鐘后,想獲得口紅System.out.println(this.girlName+"獲取口紅的鎖");}}}} }

關鍵代碼

private void makeup() throws InterruptedException {if (choice == 0){synchronized (lipstick){//獲得口紅的鎖System.out.println(this.girlName+"獲得口紅的鎖");Thread.sleep(1000);synchronized (mirror){//一秒鐘后想獲得鏡子System.out.println(this.girlName+"獲取鏡子的鎖");}}}else {synchronized (mirror){//獲得鏡子的鎖System.out.println(this.girlName+"獲得鏡子的鎖");Thread.sleep(2000);synchronized (lipstick){//兩秒鐘后,想獲得口紅System.out.println(this.girlName+"獲取口紅的鎖");}}}}

上述代碼解析,當一個線程A鎖住口紅不放,同時想拿鏡子
但是鏡子被線程B鎖住,線程B要拿到了口紅才會釋放鏡子
那么線程A就會一直等待線程B釋放鏡子鎖
但是線程B要拿不到口紅鎖就不會釋放鏡子鎖
所以兩個線程互相等待,形成死鎖,程序崩潰
運行結果

2.解決后的代碼

private void makeup() throws InterruptedException {if (choice == 0){synchronized (lipstick){//獲得口紅的鎖System.out.println(this.girlName+"獲得口紅的鎖");Thread.sleep(1000);}synchronized (mirror){//一秒鐘后想獲得鏡子System.out.println(this.girlName+"獲取鏡子的鎖");}}else {synchronized (mirror){//獲得鏡子的鎖System.out.println(this.girlName+"獲得鏡子的鎖");Thread.sleep(2000);}synchronized (lipstick){//兩秒鐘后,想獲得口紅System.out.println(this.girlName+"獲取口紅的鎖");}}}

線程A拿到了口紅鎖,然后釋放了口紅鎖,想拿鏡子鎖
線程B拿到了鏡子鎖,然后釋放了鏡子鎖,再拿口紅鎖
雙方達成共識,不會永久的等待

運行結果

總結

以上是生活随笔為你收集整理的java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例的全部內容,希望文章能夠幫你解決所遇到的問題。

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