多執行緒死鎖程式碼
阿新 • • 發佈:2018-12-18
public class DeadLock { //建立兩個物件,一個執行緒持有鎖A並且申請獲得鎖B,而另一個執行緒持有鎖B並且申請獲得鎖A就會發生死鎖。 private static final Object A=new Object(); private static final Object B=new Object(); public static void main(String[] args){ new Thread(){ public void run(){ synchronized(A){ try { Thread.sleep(50);//如果沒有這句話會因為程式執行太快而觀察不到死鎖現象 } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B){ System.out.println("拿到A的鎖並且拿到B的鎖"); } } } }.start(); new Thread(){ public void run(){ synchronized(B){ synchronized (A){ System.out.println("拿到B的鎖並且拿到A的鎖"); } } } }.start(); } }
使用lambda表示式改進一下(程式碼簡潔):
new Thread(()->{ synchronized(A){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B){ System.out.println("拿到B的鎖並且拿到A的鎖"); } } }).start(); new Thread(()->{ synchronized(B) { synchronized (A) { System.out.println("拿到B的鎖並且拿到A的鎖"); } } }).start();