死锁

死锁:当第一个线程拥有对象A锁标记,等待对象B锁标记,同时第二个线程拥有对象B锁标记,并等待对象A锁标记时,产生死锁。

一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已拥有的锁标记,由此可能造成死锁。

代码示例:

//定义A、B两把锁
    private static Object lockA = new Object();
    private static Object lockB = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            //t1先拿到A锁,然后等待B锁
            synchronized (lockA) {
                System.out.println("t1获取到锁lockA");
                synchronized (lockB) {
                    System.out.println("t1获取到锁lockB");
                }
            }
        });
        Thread t2 = new Thread(() -> {
            //t2先拿到B锁,然后等待A锁
            synchronized (lockB) {
                System.out.println("t2获取到锁lockB");
                synchronized (lockA) {
                    System.out.println("t2获取到锁lockA");
                }
            }
        });

        //启动线程
        t1.start();
        t2.start();
    }

结果:

t1获取到锁lockA
t2获取到锁lockB

这时我们会发现t1拿到了A锁,现在在等B锁;但是B锁被t2拿到了,t2又在等A锁,所以就出现了死锁。

 

解决方法:我们可以延迟启动线程t2,这样就解决了死锁问题。

//启动线程
        t1.start();
        Thread.sleep(100);//通过休眠100毫秒,保证t1可以拿到A、B锁
        t2.start();

输出结果:

t1获取到锁lockA
t1获取到锁lockB
t2获取到锁lockB
t2获取到锁lockA

 

posted @ 2022-12-27 03:19  Amireux-126  阅读(11)  评论(0)    收藏  举报