Java線程死鎖是一個經典的多線程問題,不一樣線程在等待根本不可能釋放的鎖,從而致使任務沒法完成。java
DealThread.javabash
package com.synchronsized; public class DealThread implements Runnable { public String username; public Object lock1 = new Object(); public Object lock2 = new Object(); public void setFlag(String username) { this.username = username; } @Override public void run() { if (username.equals("a")) { synchronized (lock1) { try { System.out.println("username = " + username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("lock1 -> lock2"); } } } if (username.equals("b")) { synchronized (lock2) { try { System.out.println("username = " + username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("lock2 -> lock1"); } } } } }
Run2_1.java多線程
package com.synchronsized; public class Run2_1 { public static void main(String[] args) { try { DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(100); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); } catch (InterruptedException e) { e.printStackTrace(); } } }
輸出結果:ide
username = a
username = b工具
相信你們都猜到了,兩個線程都只輸出了一句username= ,由於都在互相等待對方的鎖釋放,因此造成了死鎖。this
能夠使用JDK自帶的工具來檢測是否有死鎖。spa
打開CMD工具,進入jdk的bin目錄線程
執行jps命令code
D:\JDK\bin>jps 6560 Jps 1348 6740 Launcher 8956 Run2_1
獲得線程Run2_1 的id是8956orm
執行 jstack查看結果 :
jstack -l 8956
Found one Java-level deadlock: ============================= "Thread-1": waiting to lock monitor 0x00000000028ce258 (object 0x00000000d6080e48, a java.lang.Object), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x00000000028cb868 (object 0x00000000d6080e58, a java.lang.Object), which is held by "Thread-1" Java stack information for the threads listed above: =================================================== "Thread-1": at com.synchronsized.DealThread.run(DealThread.java:37) - waiting to lock <0x00000000d6080e48> (a java.lang.Object) - locked <0x00000000d6080e58> (a java.lang.Object) at java.lang.Thread.run(Thread.java:748) "Thread-0": at com.synchronsized.DealThread.run(DealThread.java:23) - waiting to lock <0x00000000d6080e58> (a java.lang.Object) - locked <0x00000000d6080e48> (a java.lang.Object) at java.lang.Thread.run(Thread.java:748) Found 1 deadlock.