如何避免线程死锁呢?
下文笔者讲述避免死锁的方法分享,如下所示
不会产生死锁的代码
我们打破死锁产生的条件,即可避免死锁 一、破坏互斥条件 临界资源需要互斥访问 二、破坏请求与保持条件 一次性申请所有的资源 会降低并发能力 一般不破坏请求与保持条件 三、破坏不剥夺条件 占用部分资源的线程进一步申请其他资源时 如果申请不到 可以主动释放它占有的资源 四、破坏循环等待条件 靠按序申请资源来预防 按某一顺序申请资源 释放资源则反序释放例:
不会产生死锁的代码
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 获取到就可以执行 此处破坏循环等待条件,所以可以避免死锁
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。