/**
* 卓二妹
*/
public class Deadlock {
private static Long lock1 = 0L;
private static Long lock2 = 1L;
private static Runnable runnable1 = new Runnable(){
@Override
public void run() {
synchronized (lock1){
System.out.println("get lock1 and wait for lock2");
try {
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
synchronized (lock2){
System.out.println("get lock1 and lock2");
}
}
}
};
private static Runnable runnable2 = new Runnable(){
@Override
public void run() {
synchronized (lock2){
System.out.println("get lock2 and wait for lock1");
try {
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
synchronized (lock1){
System.out.println("get lock2 and lock1");
}
}
}
};
public static void main(String[] args){
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
thread1.start();
thread2.start();
}
}
上面打印的结果输出
get lock1 and wait for lock2
get lock2 and wait for lock1
然后进程就一直卡在这里了,这里发生了明显的死锁,下面是线程的信息:
Zhuos-MacBook-Pro-2:TestThreadPool jo$ jstack -l 2439
。。。。。
"Thread-1" #12 prio=5 os_prio=31 tid=0x00007f8f2e81d800 nid=0x5803 waiting for monitor entry [0x000070000ed45000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlock$2.run(Deadlock.java:33)
- waiting to lock <0x000000076ada59a0> (a java.lang.Long)
- locked <0x000000076ada59b8> (a java.lang.Long)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"Thread-0" #11 prio=5 os_prio=31 tid=0x00007f8f2f003800 nid=0x5603 waiting for monitor entry [0x000070000ec42000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlock$1.run(Deadlock.java:16)
- waiting to lock <0x000000076ada59b8> (a java.lang.Long)
- locked <0x000000076ada59a0> (a java.lang.Long)
at java.lang.Thread.run(Thread.java:745)
。。。。。。。。。。。。。
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f8f2c8224a8 (object 0x000000076ada59a0, a java.lang.Long),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f8f2c81fab8 (object 0x000000076ada59b8, a java.lang.Long),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at Deadlock$2.run(Deadlock.java:33)
- waiting to lock <0x000000076ada59a0> (a java.lang.Long)
- locked <0x000000076ada59b8> (a java.lang.Long)
at java.lang.Thread.run(Thread.java:745)
"Thread-0":
at Deadlock$1.run(Deadlock.java:16)
- waiting to lock <0x000000076ada59b8> (a java.lang.Long)
- locked <0x000000076ada59a0> (a java.lang.Long)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
Zhuos-MacBook-Pro-2:TestThreadPool jo$
可以清晰的看到
thread-1再等对象0x000000076ada59a0的锁,锁住了0x000000076ada59b8,线程状态为阻塞,进入阻塞队列。
thread-0在等对象0x000000076ada59b8的锁,锁住了0x000000076ada59a0,线程状态为阻塞,进入阻塞队列。