死锁演示代码

死锁演示代码

死锁的四个必要条件

  • 互斥条件:一个资源每次只可以被一个进程使用
  • 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已经获得的资源,在未使用完成之前,不可以强行剥夺
  • 循环等待条件:若干进程之间行程了一种头尾相接的循环等待资源关系
package com.yishan.patterns.juc.deadLock;

import java.util.concurrent.TimeUnit;

/**
 * 死锁演示
 */
public class Demo {

    static Object a = new Object();
    static Object b = new Object();

    public static void main(String[] args) {

        new Thread(() -> {
            synchronized (a) {
                System.out.println(Thread.currentThread().getName() + "持有a,试图获取b");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (b) {
                    System.out.println(Thread.currentThread().getName() + "获取到b");
                }
            }
        }, "a").start();

        new Thread(() -> {
            synchronized (b) {
                System.out.println(Thread.currentThread().getName() + "持有b,试图获取a");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a) {
                    System.out.println(Thread.currentThread().getName() + "获取到a");
                }
            }
        }, "b").start();
    }


}

posted @ 2022-09-27 14:02  yishan99  阅读(43)  评论(0)    收藏  举报