您好,登錄后才能下訂單哦!
今天小編給大家分享的是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死鎖介紹及避免方法就分享到這里了,希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。