gitignore新增忽略檔案失效、不起作用
阿新 • • 發佈:2021-07-08
化妝的例子
兩個女生同時要化妝,需要用口紅和鏡子:
-
當女孩1拿到口紅時,1秒後需要拿到鏡子,才能解除對口紅的鎖(即:同步塊中巢狀類一個同步塊)
-
同一時間下女孩2拿到鏡子,2秒後需要拿到口紅才能解除對鏡子的鎖
-
因此兩方僵持住了,形成了死鎖
package test2; public class DeadLock { public static void main(String[] args) { Makeup g1=new Makeup(0,"girl1"); Makeup g2=new Makeup(1,"gilr2"); g1.start(); g2.start(); } } //口紅 class LipStick{ } //鏡子 class Mirror{ } //化妝 class Makeup extends Thread{ //需要的資源只有一個,用static保證只有一份 static LipStick lipStick=new LipStick(); static Mirror mirror=new Mirror(); int choice; String girlName; Makeup(int choice,String girlName){ this.choice=choice; this.girlName=girlName; } @Override public void run() { try { makeup(); } catch (InterruptedException e) { e.printStackTrace(); } } private void makeup() throws InterruptedException { if(this.choice==0){ synchronized (lipStick){ System.out.println(this.girlName+"獲得口紅的鎖"); sleep(1000); synchronized (mirror){ System.out.println(this.girlName+"獲得鏡子的鎖"); } } }else{ synchronized (mirror){ System.out.println(this.girlName+"獲得鏡子的鎖"); sleep(2000); synchronized (lipStick){ System.out.println(this.girlName+"獲得口紅的鎖"); } } } } }
修改程式碼,使其不會死鎖:把巢狀的程式碼塊分離
private void makeup() throws InterruptedException { if(this.choice==0){ synchronized (lipStick){ System.out.println(this.girlName+"獲得口紅的鎖"); sleep(1000); } synchronized (mirror){ System.out.println(this.girlName+"獲得鏡子的鎖"); } }else{ synchronized (mirror){ System.out.println(this.girlName+"獲得鏡子的鎖"); sleep(2000); } synchronized (lipStick){ System.out.println(this.girlName+"獲得口紅的鎖"); } } }