死鎖java
Java 線程是死鎖是一個經典的多線程問題,由於不一樣的線程都在等待根本不可能被釋放的鎖,從而致使全部的任務都沒法繼續完成多線程
DealThread.javaide
package dealThread.demo; 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"); } } } } }
Run.java工具
package dealThread.demo; public class Run { public static void main(String[] args){ try{ DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(1000); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
運行結果以下:this
線程thread1和thread2都持有對方的鎖,並且須要等待對方釋放鎖以後才能往下繼續運行,這個時候就發生了死鎖;其實不使用嵌套的synchronized代碼結構也會出現死鎖,與嵌套不嵌套沒有任何關係,只要互相等待對方釋放鎖就有可能出現死鎖。spa
進入JDK的安裝目錄中的bin目錄,執行jps命令:線程
能夠看出獲得運行的線程Run的id值爲7404,再執行jstack命令,查看結果:code