H5W3
当前位置:H5W3 > 其他技术问题 > 正文

手写死锁及死锁排查

1、概念

死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因

系统资源不足
进程运行推进的顺序不对
资源分配不当

死锁产生的四个必要条件

互斥
解决方法:把互斥的共享资源封装成可同时访问
占有且等待
解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,这种方式会导致资源效率低。
非抢占式
解决方法:如果进程不能立即分配资源,要求它不占有任何其他资源,也就是只能够同时获得所有需要资源时,才执行分配操作
循环等待
解决方法:对资源进行排序,要求进程按顺序请求资源。

2、死锁代码

public class DeadLock {
public static void main(String[] args) {
Resource666 res1 = new Resource666();
Resource666 res2 = new Resource666();
res1.flag = true;
res2.flag = false;
new Thread(new Runnable() {
@Override
public void run() {
res1.method();
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
res2.method();
}
},"B").start();
}
}
class Resource666 {
boolean flag = true;
private static final Object obj1 = new Object();
private static final Object obj2 = new Object();
public void method() {
if (flag) {
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + " " + "获取到锁1");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + " " + "获取到锁2");
}
}
} else {
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + " " + "获取到锁2");
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + " " + "获取到锁1");
}
}
}
}
}
 

3、如何排查死锁

当我们出现死锁的时候,首先需要使用jps命令查看运行的程序

在使用jstack查看堆栈信息

jstack  5116  # 后面参数是 jps输出的该类的pid
 

得到的结果

本文地址:H5W3 » 手写死锁及死锁排查

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址