38. 死锁
Posted 江小白谢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了38. 死锁相关的知识,希望对你有一定的参考价值。
死锁:
出现死锁的原因:线程A等待线程B释放锁资源,同时线程B等待线程A释放资源
可能出现死锁的情况:
1.存在2个或者2个以上的线程
2.存在2个或者2个以上的共享资源
需求:
有2个人要看电视,狗蛋有遥控器,张三有电池。只有电池和遥控器都有了才能看电视
代码如下:
class DeadLock extends Thread{ public DeadLock(String name) { super(name); } @Override public void run() { if("张三".equals(Thread.currentThread().getName())) { synchronized ("电池") { System.out.println("张三拿到了电池,准备去拿遥控器"); synchronized ("遥控器") { System.out.println("张三拿到了遥控器,去看电视去了"); } } }else if("狗蛋".equals(Thread.currentThread().getName())){ synchronized ("遥控器") { System.out.println("狗蛋拿到了遥控器,准备去拿电池"); synchronized ("电池") { System.out.println("狗蛋拿到了电池,去看电视去了"); } } } } } public class Demo6 { public static void main(String[] args) { DeadLock deadlock1 = new DeadLock("狗蛋"); DeadLock deadlock2 = new DeadLock("张三"); deadlock1.start(); deadlock2.start(); } }
可以发现张三拿到了电池却怎么也拿不到遥控器,狗蛋拿到了遥控器却拿不到电池,都在等待对方释放资源,这样的结果就导致死锁
分析原因:
当张三拿到了电池时,同时狗蛋也拿到了遥控器。所以这2个锁对象都是关闭的状态,都在等待别人释放资源(额,有点抽象!!!)
那么如何解决呢?
默哀,根本没有解决方案,只有自己去避免发生
以上是关于38. 死锁的主要内容,如果未能解决你的问题,请参考以下文章