什么是线程死锁?

简介: 什么是线程死锁?

线程死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外 力作用,它们都将无法推进下去。

如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方持有的资源,所以这两个 线程就会互相等待而进入死锁状态。

image.png

下面通过例子说明线程死锁

publicclassDeadLockDemo {
privatestaticObjectresource1=newObject();//资源 1privatestaticObjectresource2=newObject();//资源 2publicstaticvoidmain(String[] args) {
newThread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() +"get resource1");
try {
Thread.sleep(1000);
                } catch (InterruptedExceptione) {
e.printStackTrace();
                }
System.out.println(Thread.currentThread() +"waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() +"get resource2");
                }
            }
        }, "线程 1").start();
newThread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() +"get resource2");
try {
Thread.sleep(1000);
                } catch (InterruptedExceptione) {
e.printStackTrace();
                }
System.out.println(Thread.currentThread() +"waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() +"get resource1");
                }
            }
        }, "线程 2").start();
   }
}

代码输出如下:

Thread[线程1,5,main]getresource1Thread[线程2,5,main]getresource2Thread[线程1,5,main]waitinggetresource2Thread[线程2,5,main]waitinggetresource1

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过 Thread.sleep(1000) 。让线程 A 休眠 1s 为的是让线程 B 得到执行然后获取到 resource2 的监视器 锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的 状态,这也就产生了死锁。

相关文章
|
4月前
|
监控 Linux 编译器
多线程死锁检测的分析与实现(linux c)-有向图的应用
在日常的软件开发中,多线程是不可避免的,使用多线程中的一大问题就是线程对锁的不合理使用造成的死锁,死锁一旦发生,将导致多线程程序响应时间长,吞吐量下降甚至宕机崩溃,那么如何检测出一个多线程程序中是否存在死锁呢?在提出解决方案之前,先对死锁产生的原因以及产生的现象做一个分析。最后在用有向环来检测多线程中是否存在死锁的问题。
58 0
|
7月前
|
存储 Java
java之线程死锁和ThreadLocal的使用
java之线程死锁和ThreadLocal的使用
|
4月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
44 1
|
2月前
|
存储 安全 Java
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
72 3
|
2天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
11 1
|
4天前
|
算法 安全 Linux
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
11 0
|
12天前
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
|
22天前
|
算法 Java 编译器
【JavaEE多线程】掌握锁策略与预防死锁
【JavaEE多线程】掌握锁策略与预防死锁
23 2
|
7月前
|
Java 开发者
解锁Java多线程编程中的死锁之谜
解锁Java多线程编程中的死锁之谜
35 0
|
3月前
|
存储 监控 程序员
线程死锁检测组件逻辑与源码
线程死锁检测组件逻辑与源码
68 2