1. 程式人生 > 其它 >gitignore新增忽略檔案失效、不起作用

gitignore新增忽略檔案失效、不起作用

化妝的例子

兩個女生同時要化妝,需要用口紅和鏡子:

  • 當女孩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+"獲得口紅的鎖");
            }

             }
}