Java多线程环境下死锁模拟
1、死锁产生的条件
- 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
- 不可抢占:不能抢占进程已占有的资源
- 请求和保持:当一个进程等待其他进程释放资源时,继续占有已经分配的资源
- 循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。
注意:前三个条件都只是死锁存在的必要条件,但不是充分条件。第四个条件是充分条件。以上条件同样适用于线程。
2、模拟多线程环境下死锁的产生
/**
* 死锁产生的四个条件:互斥 请求和保持 不可抢占 循环等待
* synchronized锁住对象资源,保证互斥和不可抢占
* 先持有一个资源,再去申请另一个资源->请求和保持
*/
public class DeadLock {
// 模拟两个资源
public static Object lock1 = new Object();
public static Object lock2 = new Object();
// 先申请lock1资源,再去申请lock2资源
public static void getLock1First(){
synchronized (lock1){
System.out.println("getlock1");
getLock2();
}
}
public static void getLock2(){
synchronized (lock2) {
System.out.println("lock1->lock2");
}
}
// 先申请lock2资源,再申请lock1资源
public static void getlock2First(){
synchronized (lock2){
System.out.println("getlock2");
getLock1();
}
}
public static void getLock1(){
synchronized (lock1){
System.out.println("lock2->lock1");
}
}
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
// 太难把控线程运行的时机了 也有可能此线程执行完了lock1->lock2的顺序
// 直接死循环一直运行
// 总会刚好遇到线程1刚好获得lock1,线程2刚好获得lock2
while (true){
getLock1First();
}
}
}.start();
new Thread(){
@Override
public void run() {
while (true){
getlock2First();
}
}
}.start();
}
}
死锁:

3、死锁的排查
先进入jdk安装的bin目录,启动命令行,输入命令jps查看运行的线程ID
死锁检测1:

执行jstack -l 线程ID命令
死锁检测2:

可以看到Thread-1和Thread-2都在相互等待对方持有的对象的monitor锁释放。
到此这篇关于Java多线程环境下死锁模拟的文章就介绍到这了,更多相关Java多线程死锁模拟内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合WebSocket实现后端向前端发送消息的实例代码
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,下面这篇文章主要给大家介绍了关于SpringBoot整合WebSocket实现后端向前端发送消息的相关资料,需要的朋友可以参考下2023-03-03
Spring Security 在 Spring Boot 中的使用详解【集中式】
这篇文章主要介绍了Spring Security 在 Spring Boot 中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
Mybatis Mapper中多参数方法不使用@param注解报错的解决
这篇文章主要介绍了Mybatis Mapper中多参数方法不使用@param注解报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。2022-01-01
Java8新特性之Collectors.joining()实例详解
在项目中我们常常要对list集合的数据做一些字符串拼接/处理等相关操作,下面这篇文章主要给大家介绍了关于Java8新特性之Collectors.joining()的相关资料,需要的朋友可以参考下2023-01-01
智能 AI 代码生成工具 Cursor 安装和使用超详细教程
Cursor.so 是一个集成了 GPT-4 的国内直接可以访问的,优秀而强大的免费代码生成器,可以帮助你快速编写、编辑和讨论代码,这篇文章主要介绍了智能 AI 代码生成工具 Cursor 安装和使用介绍,需要的朋友可以参考下2023-05-05


最新评论