目录
1 是什么
死锁是指连哥哥或两个以上的进程在执行过程中,因争夺资源而曹诚的一种互相等待的现象。
若无外力干涉,那他们就将无法推进下去。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因为争夺有限的资源而陷入死锁。
1.1 产生死锁的主要原因
- 系统资源不足
- 进程运行推进的顺序不合适
- 资源分配不当
2 代码
死锁代码
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + ", 尝试持有:" + lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + ", 尝试持有:" + lockA);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/**
* Description: 死锁是指两个或两个i以上的进程在执行过程中,
* 因争夺资源而造成的一种互相等待的现象。
* 若无外力干涉那它们都将无法推进下去。
* User: hqq
* Date: 2021/8/7
* Time: 16:42
*/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "AAA").start();
new Thread(new HoldLockThread(lockB, lockA), "BBB").start();
}
}
证明定位是死锁问题
利用linux命令:
iostack
freedisk
jps
jstack
3 解决
- jsp命令定位进程号
- jstack找到死锁查看
4 参考文献
以上内容均来自于下方视频,博客内容仅作为个人学习笔记记录
【1】Java面试_高频重点面试题 (第一、二、三季)_ 面试 第1、2、3季_柴林燕_周阳_哔哩哔哩_bilibili