13.デッドロック

デッドロック

  • 同期されたコードブロックが同時に「3つ以上のオブジェクトのロック」を保持している場合、「デッドロック」の問題が発生する可能性があります
  • デッドロック:複数のスレッドが互いのリソースを保持し、デッドロックを形成します

デッドロックの4つの条件

  1. 相互排除条件:リソースは一度に1つのプロセスでのみ使用できます
  2. 要求と保留の条件:リソースを要求することによってプロセスがブロックされると、取得したリソースを保持します
  3. 剥奪条件なし:プロセスが取得したリソースは、使い果たされる前に強制的に剥奪することはできません。
  4. 循環待機条件:複数のプロセス間で循環待機リソース関係が形成されます。

デッドロックに必要な4つの条件は、上記のとおりです。1つ以上のデッドロックを破壊する方法を見つければ、デッドロックを回避できます。

package com.thread;

public class DeadLock {
    public static void main(String[] args) {
        Makeup g1 = new Makeup(0,"灰姑娘");
        Makeup g2 = new Makeup(1,"白雪公主");

        new Thread(g1).start();
        new Thread(g2).start();
    }
}

// 口红
class Lipstick{

}

// 镜子
class Mirror{

}

class Makeup implements Runnable{
    // 需要的资源只要一份,用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;
    }

    @Override
    public 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 + "获得镜子的锁");
                // }
            }
            // 解决方法,将锁放入外面,通过释放上一个锁来获取下一个锁
            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 + "获得口红的锁");
                //  }
            }
            synchronized (lipstick){ // 两秒钟后想获得口红的锁
                System.out.println(this.girlName + "获得口红的锁");
            }
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_56121715/article/details/123780981