欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java避免死鎖的常見方法代碼解析

 更新時間:2018年01月02日 11:19:37   作者:聽說你在這里  
這篇文章主要介紹了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的this關(guān)鍵字的使用與方法的重載相關(guān)知識,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式

    SpringBoot打包成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-01
  • java簡單實現(xiàn)八叉樹圖像處理代碼示例

    java簡單實現(xiàn)八叉樹圖像處理代碼示例

    這篇文章主要介紹了java簡單實現(xiàn)八叉樹圖像處理代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 使用spring stream發(fā)送消息代碼實例

    使用spring stream發(fā)送消息代碼實例

    這篇文章主要介紹了使用spring stream發(fā)送消息代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解

    SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解

    這篇文章主要為大家介紹了SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題

    解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題

    這篇文章主要介紹了如惡化解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • JVM調(diào)試命令與調(diào)試工具詳解

    JVM調(diào)試命令與調(diào)試工具詳解

    JVM statistics Monitoring,用于監(jiān)視虛擬機運行時狀態(tài)信息的命令,它可以顯示出虛擬機進程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運行數(shù)據(jù),這篇文章主要介紹了JVM調(diào)試命令與調(diào)試工具,需要的朋友可以參考下
    2023-10-10
  • Java 中的 DataInputStream 介紹_動力節(jié)點Java學(xué)院整理

    Java 中的 DataInputStream 介紹_動力節(jié)點Java學(xué)院整理

    DataInputStream 是數(shù)據(jù)輸入流。它繼承于FilterInputStream。接下來通過本文給大家介紹Java 中的 DataInputStream的相關(guān)知識,需要的朋友參考下吧
    2017-05-05
  • Spring?MVC?URL地址映射的示例代碼

    Spring?MVC?URL地址映射的示例代碼

    @RequestMapping是一個用來處理請求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑。,這篇文章主要介紹了Spring?MVC?URL地址映射,需要的朋友可以參考下
    2022-07-07
  • 基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能

    基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能

    QQ 郵箱是由騰訊公司推出的一款免費郵箱服務(wù),它提供了完整的郵件發(fā)送和接收功能,并且還支持多種郵件格式和附件類型,QQ 郵箱還具有強大的反垃圾郵件功能,可以有效地過濾垃圾郵件,并保護用戶隱私和安全,所以本文給大家介紹了基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能
    2024-11-11

最新評論