java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例
生活随笔
收集整理的這篇文章主要介紹了
java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.死鎖代碼
//死鎖:多個(gè)線程互相抱著對(duì)方需要的資源,然后形成僵局 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來(lái)保證只有一份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+"獲取口紅的鎖");}}}} }關(guān)鍵代碼
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+"獲取口紅的鎖");}}}}上述代碼解析,當(dāng)一個(gè)線程A鎖住口紅不放,同時(shí)想拿鏡子
但是鏡子被線程B鎖住,線程B要拿到了口紅才會(huì)釋放鏡子
那么線程A就會(huì)一直等待線程B釋放鏡子鎖
但是線程B要拿不到口紅鎖就不會(huì)釋放鏡子鎖
所以兩個(gè)線程互相等待,形成死鎖,程序崩潰
運(yùn)行結(jié)果
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拿到了鏡子鎖,然后釋放了鏡子鎖,再拿口紅鎖
雙方達(dá)成共識(shí),不會(huì)永久的等待
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的java线程(16)——死锁讲解,白雪公主与灰姑娘抢口红和镜子的案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SJA1000的调试经历【转】
- 下一篇: 51单片机用c语言在液晶1602上显示汉