死锁是指两个或两个线程自己持有锁并去争抢其他资源造成的互相等待的现象。
产生死锁的主要原因:
1.因为系统资源不足
2.进程运行推进的顺序不合适
3.资源分配不当
产生死锁的四个必要条件:
1.互斥条件
2.占有且等待
3.不可强行占有
4.循环等待条件
/**
* 死锁case
*/
public class DeadLock implements Runnable{
private String lockA;
private String lockB;
public DeadLock(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);
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"\t 自己持有"+lockB+"尝试获得"+lockA);
}
}
}
public static void main(String[] args) {
String lockA="lockA";
String lockB="lockB";
new Thread(new DeadLock(lockA,lockB),"ThreadAA").start();
new Thread(new DeadLock(lockB,lockA),"ThreadBB").start();
}
}
监测死锁可以使用jdk自带的工具。首先进入cmd命令,进入jdk安装目录下的bin目录下,执行jps命令,得到运行的线程的id,再执行jstack命令,查看结果。(或者使用idea Terminal终端运行命令)