如何避免线程死锁呢?
下文笔者讲述避免死锁的方法分享,如下所示
不会产生死锁的代码
我们打破死锁产生的条件,即可避免死锁
一、破坏互斥条件
临界资源需要互斥访问
二、破坏请求与保持条件
一次性申请所有的资源
会降低并发能力
一般不破坏请求与保持条件
三、破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时
如果申请不到
可以主动释放它占有的资源
四、破坏循环等待条件
靠按序申请资源来预防
按某一顺序申请资源
释放资源则反序释放
例:不会产生死锁的代码
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "线程 2").start();
----运行以上代码,将输出以下信息-----
Thread[线程 1,5,main]get resource1
Thread[线程 1,5,main]waiting get resource2
Thread[线程 1,5,main]get resource2
Thread[线程 2,5,main]get resource1
Thread[线程 2,5,main]waiting get resource2
Thread[线程 2,5,main]get resource2
以上代码的运行流程:
线程 1 首先获得到 resource1 的监视器锁
此时线程 2 无法获取
然后线程 1 再去获取 resource2 的监视器锁,可以获取到
然后线程 1 释放了对 resource1、resource2 的监视器锁的占用
线程 2 获取到就可以执行
此处破坏循环等待条件,所以可以避免死锁
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


