什么是线程死锁?
线程 什么 死锁
2023-09-27 14:24:43 时间
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。
下面通过例子说明线程死锁
public class DeadLockDemo {
private static Object resource1 = new Object();//资源 1
private static Object resource2 = new Object();//资源 2
public static void main(String[] args) {
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");
}
}
}, "线程 1").start();
new Thread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
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]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1
线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过 Thread.sleep(1000);让线程 A 休眠 1s 为的是让线程 B 得到执行然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁。
相关文章
- SpringBoot中的线程池
- 什么是Python线程?Python线程如何创建?
- 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
- Java进阶:线程池、局部变量、内部类、静态嵌套类和引用,哦,还有一个坑
- 撸完这篇线程池,我快咳血了!
- MFC中创建线程实例
- 线程系列04,传递数据给线程,线程命名,线程异常处理,线程池
- AQS(线程同步器)介绍
- java 线程池线程忙碌且阻塞队列也满了时给一个拒接的详细报告
- 还不知道如何在java中终止一个线程?快来,一文给你揭秘
- java高级用法之:绑定CPU的线程Thread-Affinity
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
- 线程同步之信号量
- 线程_threading合集
- java线程中断Interrupted用法