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. 死锁的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战 04死锁了怎么办?

Java并发编程实战 04死锁了怎么办?

是否可以动态编译和执行 C# 代码片段?

使用 NOLOCK 消除具有悲观锁定的应用程序的死锁

编写代码片段的更简洁的方法

Android中切换标签片段之间的延迟