Java死锁

public class DeadLockDemo {

    private static final Object HAIR_A = new Object();
    private static final Object HAIR_B = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (HAIR_A) {
                try {
                    Thread.sleep(50L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (HAIR_B) {
                    System.out.println("A成功的抓住了B的头发");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (HAIR_B) {
                synchronized (HAIR_A) {
                    System.out.println("B成功抓住了A的头发");
                }
            }
        }).start();
    }
}

当我们不休眠那50毫秒,则死锁的情况不是100%发生,我们休眠那50毫秒之后

  • 第一个线程先锁了HAIR_A,然后休眠50毫秒
  • 此时第二个线程执行了,他拿到了HAIR_B,要去拿HAIR_A的时候发现拿不到
  • 这时第一个线程休眠结束,当他要拿HAIR_B时,发现HAIR_B也拿不到

这个时候这两个线程一个等HAIR_A释放,一个等HAIR_B释放,进入了死锁状态

posted @ 2022-09-25 23:53  jarico  阅读(20)  评论(0)    收藏  举报