zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

【并发编程013】为什么会出现死锁?写出死锁的代码?

并发编程代码 为什么 出现 死锁 写出 013
2023-09-27 14:29:27 时间

为什么会出现死锁?写出死锁的代码?

死锁的产生必须具备以下四个条件。

  • 互斥条件: 指线程对己经获取到的资源进行排它性使用, 即该资源同时只由一个线程 占用 。 如果此时还有其他线程请求获取该资源, 则请求者只能等待, 直至占有资源的 线程释放该资源。
  • 请求并持有条件: 指一个线程己经持有了至少一个资源, 但又提出了新的资源请求, 而新资源己被其他线程占有, 所以当前线程会被阻塞, 但阻塞的同时并不释放自己己 经获取的资源。
  • 不可剥夺条件: 指线程获取到的资源在自己使用完之前不能被其他线程抢占, 只有在 自己使用完毕后才由自己释放该资源。
  • 环路等待条件: 指在发生死锁时, 必然存在一个线程→资源的环形链, 即线程集合 {T0 , T1, T2, …, Tn} 中的T0 正在等待一个T1 占用的资源, T1 正在等待T2 占用的资源, ……Tn 正在等待己被T0 占用的资源。
public class DeadLockDemo {
    private static String A = "A";
    private static String B = "B";

    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }

    private void deadLock() {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                //线程1获取A的锁
                synchronized (A) {
                    try {
                        Thread.currentThread().sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B) {
                        System.out.println("1");
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                //线程2获取B的锁
                synchronized (B) {
                    //A对象已经被线程1持有
                    synchronized (A) {
                        System.out.println("2");
                    }
                }
            }
        });
        t1.start();
        t2.start();
    }
}