java死锁编程及定位分析

文章目录
  1. 1. 死锁编程及定位分析
    1. 1.1. 是什么
    2. 1.2. 产生死锁的主要原因
    3. 1.3. 代码:DeadLockDemo
    4. 1.4. 解决

死锁编程及定位分析

是什么

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

产生死锁的主要原因

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

代码:DeadLockDemo

public class DeadLockDemo {

public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "ThreadAAA").start();
new Thread(new HoldLockThread(lockB, lockA), "ThreadBBB").start();
}
}

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() + " 自己持有: " + lockA + " 尝试获得: " + lockB);
try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + " 自己持有: " + lockB + " 尝试获得: " + lockA);
}
}
}
}

解决

  1. jps 命令定位进程号
  2. jstack 找到死锁查看