【Java】学习路径50-线程死锁问题

Posted on 2022-05-11 23:35  罗芭Remoo  阅读(28)  评论(0编辑  收藏  举报

生活化的例子:比如说有两个人,一把刀和一把叉子;

第一个人先需要一把刀,然后还需要一把叉子;

第二个人先需要一把叉子,然后还需要一把刀。

我们理想的情况是:一个人拿着刀,然后再拿到叉子,把事情做完,然后归还刀和叉子。

  第二个人先拿到叉子,再拿到刀,然后一起归还。

  两两互不干扰。

但是现实的情况有可能是:第一个人先拿了一把刀,但是叉子却给第二个人占用了,

  那么现在的情况就是两个人都干不完活,各自缺少对方手中拿的东西。

这就是线程死锁问题。

用程序来说明:

public class DeathLock1 implements Runnable {
    @Override
    public void run() {
        synchronized (DeathLock.lock1) {
            System.out.println("线程1:现在使用第一把锁");
            synchronized (DeathLock.lock2) {
                System.out.println("线程1:两把锁一起使用");
            }
        }
    }
}
public class DeathLock2 implements Runnable {
    @Override
    public void run() {
        synchronized (DeathLock.lock2) {
            System.out.println("线程2:现在使用第二把锁");
            synchronized (DeathLock.lock1) {
                System.out.println("线程2:两把锁一起使用");
            }

        }
    }
}


解决方法:

让两个线程按照同样的顺序解锁。

将lock2线程改为:

public class DeathLock2 implements Runnable {
    @Override
    public void run() {
        synchronized (DeathLock.lock1) {
            
            synchronized (DeathLock.lock2) {
                System.out.println("线程2:现在使用第二把锁");
                System.out.println("线程2:两把锁一起使用");
            }

        }
    }
}

这样就解决了。