java避免死鎖的常見方法代碼解析
死鎖
索是一個非常有用的工具,運用場景非常多,因為它使用起來非常簡單,而且易于理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產(chǎn)生死鎖,就會造成系統(tǒng)功能不可用。讓我們先來看一段代碼,這段代碼會引起死鎖,使線程 thread_1 和線程 thread_2 互相等待對方釋放鎖。
package thread; public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String args[]) { new DeadLockDemo().deadLock(); } private void deadLock() { // 線程thread_1 Thread thread_1 = new Thread(new Runnable() { @Override public void run() { synchronized (A) { System.err.println("--thread_1 lock A----"); synchronized (B) { System.err.println("--thread_1 lock B----"); } } } } ); // 線程thread_2 Thread thread_2 = new Thread(new Runnable() { @Override public void run() { synchronized (B) { System.out.println("--thread_2 lock B----"); synchronized (A) { System.out.println("--thread_2 lock A----"); } } } } ); thread_1.start(); thread_2.start(); } }
這段代碼只是演示死鎖的場景,在現(xiàn)實中你可能不會寫出這樣的代碼。但是在一些更為復(fù)雜的場景中,你可能會遇到這樣的問題,比如 thread_1 拿到索之后,因為一些異常情況沒有釋放索(死循環(huán))。又或者是 thread_1 拿到一個數(shù)據(jù)庫索,釋放鎖的時候拋出了異常,沒釋放掉。
一旦出現(xiàn)死鎖,業(yè)務(wù)是可感知的,因為不能繼續(xù)提供服務(wù)了,那么只能通過dump 線程查看到底是哪個線程出現(xiàn)了問題,以下線程信息告訴我們是 DeadLockDemo類的第 35 行和21行引起了死鎖。
"Thread-1" prio=6 tid=0x000000000cb13800 nid=0x19ac waiting for monitor entry [0 x000000000d67f000] java.lang.Thread.State: BLOCKED (on object monitor) at thread.DeadLockDemo$2.run(DeadLockDemo.java:35) - waiting to lock <0x00000007d5a9be88> (a java.lang.String) - locked <0x00000007d5a9beb8> (a java.lang.String) at java.lang.Thread.run(Unknown Source) "Thread-0" prio=6 tid=0x000000000cb0e800 nid=0x6bc waiting for monitor entry [0x 000000000d48f000] java.lang.Thread.State: BLOCKED (on object monitor) at thread.DeadLockDemo$1.run(DeadLockDemo.java:21) - waiting to lock <0x00000007d5a9beb8> (a java.lang.String) - locked <0x00000007d5a9be88> (a java.lang.String) at java.lang.Thread.run(Unknown Source)
避免死鎖的幾個常見方法。
避免一個線程同時獲取多個鎖。
避免一個線程在索內(nèi)同時占用多個資源,盡量保證每個索只占用一個資源。
嘗試使用定時索,使用 lock.tryLock(timeout) 來替代使用內(nèi)部索機制。
對于數(shù)據(jù)庫索,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況。
referance:
http://www.dbjr.com.cn/article/131946.htm
http://www.dbjr.com.cn/article/131943.htm
總結(jié)
以上就是本文關(guān)于java避免死鎖的常見方法代碼解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java的this關(guān)鍵字的使用與方法的重載相關(guān)知識
這篇文章主要介紹了Java的this關(guān)鍵字的使用與方法的重載相關(guān)知識,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
Spring Boot是一個用于構(gòu)建獨立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式,感興趣的可以了解一下2024-01-01SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解
這篇文章主要為大家介紹了SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題
這篇文章主要介紹了如惡化解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11Java 中的 DataInputStream 介紹_動力節(jié)點Java學(xué)院整理
DataInputStream 是數(shù)據(jù)輸入流。它繼承于FilterInputStream。接下來通過本文給大家介紹Java 中的 DataInputStream的相關(guān)知識,需要的朋友參考下吧2017-05-05基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能
QQ 郵箱是由騰訊公司推出的一款免費郵箱服務(wù),它提供了完整的郵件發(fā)送和接收功能,并且還支持多種郵件格式和附件類型,QQ 郵箱還具有強大的反垃圾郵件功能,可以有效地過濾垃圾郵件,并保護用戶隱私和安全,所以本文給大家介紹了基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能2024-11-11