网站首页 > java教程 正文
是什么
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
案例:
public class DeadLock implements Runnable {
/**
* 一个简单的死锁类
* 当DeadLock类的对象f1ag==1时(deadLock1),先锁定o1,睡眠500亳秒
* 而deadLock1在睡眠的时候另一个flag==0的对象(deadLock2)线程启动,先锁定o2,睡眠500亳秒
* deadLock1睡眠结束后需要锁定o2才能继续执行,而此时o2已被deadLock2锁定;
* deadLock2睡眠结束后需要锁定o1才能继续执行,而此时o1已被deadLock1锁定;
* deadLock1、deadLock2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。
*/
private int flag = 1;
/**
* 静态对象是类的所有对象共享的
*/
private static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("卡在线程1");
synchronized (o2){
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("卡在线程1");
synchronized (o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock deadLock1 = new DeadLock();
DeadLock deadLock2 = new DeadLock();
deadLock1.flag = 1;
deadLock2.flag = 0;
// deadLock1,deadLock2 都可执行,但JVM线程调度先执行哪个线程是不确定的
// deadLock2 的run可能在deadLock1的run之前运行
new Thread(deadLock1).start();
new Thread(deadLock2).start();
// 结果只会输出
// flag=0
// flag=1 线程没有终止 1,0输不出 死锁。
}
}
怎么看
jdk/bin/jconsole.exe
jdk/bin/jvisualvm.exe
怎么做
- 减少锁对象,使用静态对象或者直接this
- 换ReentrantLock,使用tryLock在几秒内获取失败自动放弃
- 优化代码逻辑,按照顺序获取资源
猜你喜欢
- 2025-03-24 虾皮二面:MySQL 中有哪些锁?表级锁和行级锁有什么区别?
- 2025-03-24 Java三种方式实现redis分布式锁(java 实现redis分布式锁)
- 2025-03-24 java编程开发经常遇到的十个问题(java编程遇到的问题及解决办法)
- 2025-03-24 线程池误用导致系统假死(线程池爆了)
- 2025-03-24 如何编写高效的Java代码(写java代码的步骤)
- 2025-03-24 Java多线程编程的7个致命陷阱90%的程序员都在第3个坑里疯狂加班
- 2025-03-24 什么是死锁?如何避免死锁?(什么是死锁?用什么方法实现死锁的避免?)
- 2025-03-24 Java进程突然失去响应的原因排查(java进程崩溃)
- 2025-03-24 Java面试题及答案最全总结(2025版)
- 2025-03-24 多线程场景下,什么情况会发生死锁?该如何避免死锁?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)