synchronized死锁问题
死锁产生: 线程A持有资源r1的锁,等待获取资源r2;线程B持有资源r2的锁,等待获取资源r1;线程A不愿意放弃资源r1的锁,而线程B也不愿意放弃资源r2的锁
调试用例:
public class DeadSynThread implements Runnable {
private byte[] lock1 = new byte[0];
private byte[] lock2 = new byte[0];
@Override
public void run() {
if (Thread.currentThread().getName().equals("a")){
synchronized (lock1){
System.out.println(Thread.currentThread().getName()+ "获取lock1的锁,等待lock2...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println(Thread.currentThread().getName()+"执行lock1---> lock2");
}
}
}else {
synchronized (lock2){
System.out.println(Thread.currentThread().getName()+ "获取lock2的锁,等待lock1...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1){
System.out.println(Thread.currentThread().getName()+"执行lock2---> lock1");
}
}
}
}
public static void main(String[] args) {
DeadSynThread deadSynThread = new DeadSynThread();
Thread t1 = new Thread(deadSynThread);
t1.setName("a");
t1.start();
Thread t2 = new Thread(deadSynThread);
t2.setName("b");
t2.start();
}
}
结果:
b获取lock2的锁,等待lock1...
a获取lock1的锁,等待lock2...
使用jps
查看正在执行的线程:
C:\Users\bingo>jps
11280 DeadSynThread
15504 RemoteMavenServer
10788
6388 Launcher
6360 Jps
使用jstack
查看具体情况:
C:\Users\bingo>jstack 11280
2018-03-31 23:12:28
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode):
"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x0000000005032800 nid=0x2614 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"b" #12 prio=5 os_prio=0 tid=0x000000001aeb9000 nid=0x42ac waiting for monitor entry [0x000000001bb9f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:37)
- waiting to lock <0x00000000d7d90358> (a [B)
- locked <0x00000000d7d90368> (a [B)
at java.lang.Thread.run(Thread.java:745)
"a" #11 prio=5 os_prio=0 tid=0x000000001aeb6000 nid=0x3260 waiting for monitor entry [0x000000001ba9e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:23)
- waiting to lock <0x00000000d7d90368> (a [B)
- locked <0x00000000d7d90358> (a [B)
at java.lang.Thread.run(Thread.java:745)
....
Found one Java-level deadlock:
=============================
"b":
waiting to lock monitor 0x0000000019910628 (object 0x00000000d7d90358, a [B),
which is held by "a"
"a":
waiting to lock monitor 0x000000001990dc38 (object 0x00000000d7d90368, a [B),
which is held by "b"
Java stack information for the threads listed above:
===================================================
"b":
at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:37)
- waiting to lock <0x00000000d7d90358> (a [B)
- locked <0x00000000d7d90368> (a [B)
at java.lang.Thread.run(Thread.java:745)
"a":
at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:23)
- waiting to lock <0x00000000d7d90368> (a [B)
- locked <0x00000000d7d90358> (a [B)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
可以看到线程a和线程都是阻塞状态BLOCKED
,死锁产生