java 多线程并发之死锁

当多个线程相互等待已经被对方占用的资源时,就会产生死锁。

举例


public class DeadLock {
    public static void main(String[] args) {
        // 锁A
        Object lockA = new Object();
        // 锁B
        Object lockB = new Object();
        // 第一条线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1开始 #####");
                synchronized (lockA) {
                    try {
                        System.out.println("lockA #####");
                        Thread.sleep(1000);
                        synchronized (lockB) {
                            System.out.println("线程1");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t1.start();
        // 第二条线程
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2开始 #####");
                synchronized (lockB) {
                    try {
                        System.out.println("lockB #####");
                        Thread.sleep(1000);
                        synchronized (lockA) {
                            System.out.println("线程2");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t2.start();
    }
}

运行结果

线程1开始 #####
lockA #####
线程2开始 #####
lockB #####

上述过程简述如下
1.线程1首先获得锁A,然后sleep 2秒
2.线程1首先获得锁B,然后sleep 2秒
3.线程1 sleep 2秒后继续执行,此时需要锁B,但是此时B已经被线程持有,线程1被阻塞。
4.线程2 sleep 2秒后继续执行,它需要锁A,然而A此时被线程1持有还未释放,线程2被阻塞
5.这时就会出现死锁,如运行结果那样。

避免死锁

1.同一线程不要嵌套使用多个锁
2.同一线程不要占用多个计算机资源
3.给锁加上超时时间

猜你喜欢

转载自blog.csdn.net/qg_zhang/article/details/80152009