死锁
是指两个
或两个以上
的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
下面是死锁现象的java代码实现
public class MyLock implements Runnable {
String lockA;
String lockB;
public MyLock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run(){
synchronized(lockA){
System.out.println("持有锁"+lockA+"想要获取锁"+lockB);
synchronized(lockB){
System.out.println("持有锁"+lockA+"想要获取锁"+lockB);
}
}
}
}
class DeadLockDemo{
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new MyLock(lockA,lockB),"AA").start();
new Thread(new MyLock(lockB,lockA),"BB").start();
}
}
死锁现象如何排查呢,使用idea的控制台即可
D:\IdealJava>jps -l
10848
12056 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
14232 org.jetbrains.jps.cmdline.Launcher
15768 com.athome.DeadLockDemo
12124 sun.tools.jps.Jps
使用jps -l可以找到当前执行不下去的类
15768 com.athome.DeadLockDemo
然后使用D:\IdealJava>jstack 15768就可以查看为什么当前类不能执行下去的原因:
Java stack information for the threads listed above:
·===================================================·
“BB”:
at com.athome.MyLock.run(MyLock.java:20)
- waiting to lock <0x00000000d5cf4258> (a java.lang.String)
- locked <0x00000000d5cf4290> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
“AA”:
at com.athome.MyLock.run(MyLock.java:20)
- waiting to lock <0x00000000d5cf4290> (a java.lang.String)
- locked <0x00000000d5cf4258> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
所以发现是deadlock,即死锁,这下普通人也能知道是死锁啦。