java 執行緒死鎖
阿新 • • 發佈:2020-09-06
java執行緒死鎖
java執行緒死鎖程式碼示例:
public class DeadLockTest { Lock lock1 = new ReentrantLock(true); Lock lock2 = new ReentrantLock(true); public void test1() throws InterruptedException { lock1.lock(); Thread.sleep(3000); System.out.println("lock1"); test2(); lock1.unlock(); } public void test2() throws InterruptedException { lock2.lock(); Thread.sleep(3000); System.out.println("lock2"); test1(); lock2.unlock(); } public static void main(String[] args) { final DeadLockTest deadLockTest = new DeadLockTest(); Thread t1 = new Thread(new Runnable() { public void run() { try { deadLockTest.test1(); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(new Runnable() { public void run() { try { deadLockTest.test2(); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); t2.start(); } }
先建立兩個執行緒鎖lock1、lock2,test1()方法中請求lock1鎖,鎖住test1,然後
讓執行緒1sleep(讓另一執行緒能夠有足夠時間請求對test2()的lock鎖),在test2()方法中請求lock2鎖,同樣讓執行緒2sleep,這樣兩個執行緒都有足夠時間獲取鎖。這樣就形成了兩個執行緒互相等待對方釋放鎖,不然程式就無法繼續執行下去,形成了死鎖的局面。
執行結果:
程式在這個情況下一直處於死鎖狀態,程式的狀態仍然處於執行狀態,只要兩個執行緒都不釋放手中的鎖,那麼程式就會一直僵持在這種狀態持續下去。