1. 程式人生 > 其它 >LeetCode Hot 熱題100 演算法題 104.二叉樹的最大深度-演算法&測試-easy模式

LeetCode Hot 熱題100 演算法題 104.二叉樹的最大深度-演算法&測試-easy模式

死鎖

產生死鎖的四個必要條件

  1. 互斥條件:一個資源每次只能被一個程序使用。

  2. 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。

  3. 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

  4. 迴圈等待條件:若程序之間形成一種頭尾詳解的迴圈等待資源的關係。

    我們只要想辦法破其中的一個或多個條件就可以避免死鎖發生。

    package Thread;
    //死鎖:多個執行緒互相抱著對方需要的資源,然後形成僵持
    public class DeadLock {
    public static void main(String[] args) {
    Makeup g1 = new Makeup(0,"灰姑娘");
    Makeup g2 = new Makeup(1,"白雪公主");
    g1.start();
    g2.start();

    }
    }
    //口紅
    class Lipstick{

    }
    //鏡子
    class Mirror{

    }
    class Makeup extends Thread{
    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() {
    //化妝
    makeup();
    }
    //化妝,互相持有對方的鎖,就是需要拿到對方的資源
    private void makeup(){
    if (choice==0){
    synchronized (lipstick) {
    System.out.println(this.girlName + "獲得口紅的鎖");
    try {
    Thread.sleep(1000);

    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    synchronized (mirror){
    System.out.println(this.girlName+"獲得鏡子的鎖");
    }
    }else{
    synchronized (mirror){
    System.out.println(this.girlName+"獲得鏡子的鎖");
    try {
    Thread.sleep(2000);


    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    synchronized (lipstick){
    System.out.println(this.girlName+"獲得口紅的鎖");
    }
    }
    }
    }