本篇文章帶給大家的內容是java並發學習之什麼是死鎖?死鎖的介紹。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
死鎖的介紹:
鎖定是一個非常有用的工具,運作場景非常多,因為它使用起來非常簡單,而且很容易理解。但同時它也會帶來一些困擾,例如死鎖問題。例如有兩個執行緒A和B,運行都需要兩個資源a,b。 A取得了a資源,B取得了b資源,接著A去請求b資源,B去請求a資源,兩個執行緒互相阻塞產生死鎖。
程式碼範例:
public calss DeadLockDemo{ private static String A = "A"; private static String B = "B"; public static void main(String[] args){ new DeadLockdemo().deadLock(); } private void deadLock(){ Thread t1 = new Thread(new Runnable(){ @Override public void run(){ synchronized(A){ try{ Thread.currentThread().sleep(2000); }catch(Exception e){ e.printStackTrace(); } synchronized(B){ System.out.println("B"); } } } }); Thread t2 = new Thread(new Runnable(){ @Override public void run(){ synchronized(B){ try{ Thread.currentThread().sleep(2000); }catch(Exception e){ e.printStackTrace(); } synchronized(A){ System.out.println("A"); } } } }); t1.start(); t2.start(); } }
上述程式碼執行後會發生死鎖,t1和t2互相阻塞。
死鎖產生的場景分析:
在一個更為複雜的場景中,你可能會遇到這樣的問題,t1拿到鎖之後,因為一些例外狀況而沒有釋放鎖(死循環)。或是t1拿到了一個資料庫鎖,釋放鎖的時候拋出了異常沒釋放掉。
避免死鎖的幾種方法:
1.盡量避免一個執行緒同時取得多個鎖定。
2.盡量避免一個執行緒同時佔據多個支援,盡量一個執行緒同時只佔據一個資源。
3.嘗試使用定時鎖定。 Lock.tryLock(timeout)來取代使用內部鎖定機制。
4.對於資料庫鎖,加鎖和解鎖必須在一個資料庫連線裡進行。
以上是java並發學習之什麼是死鎖?死鎖的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!