java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: SJA1000的调试经历【转】
- 下一篇: 51单片机用c语言在液晶1602上显示汉
