溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java死鎖介紹及避免方法

發(fā)布時(shí)間:2020-04-22 14:20:02 來源:億速云 閱讀:200 作者:小新 欄目:編程語言

今天小編給大家分享的是java死鎖介紹及避免方法,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。

  • 死鎖的介紹:
    鎖是一個(gè)非常有用的工具,運(yùn)行場(chǎng)景非常多,因?yàn)樗褂闷饋矸浅:?jiǎn)單,而且易于理解。但同時(shí)它也會(huì)帶來一些困擾,比如死鎖問題。比如有兩個(gè)線程A和B,運(yùn)行都需要兩個(gè)資源a,b。A獲取了a資源,B獲取了b資源,接著A去請(qǐng)求b資源,B去請(qǐng)求a資源,兩個(gè)線程互相阻塞產(chǎn)生死鎖。

  • 代碼示例:

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();
	}
}

上述代碼執(zhí)行后會(huì)發(fā)生死鎖,t1和t2互相阻塞。

  • 死鎖產(chǎn)生的場(chǎng)景分析:
    在一個(gè)更為復(fù)雜的場(chǎng)景中,你可能會(huì)遇到這樣的問題,t1拿到鎖之后,因?yàn)橐恍┊惓G闆r而沒有釋放鎖(死循環(huán))。或者t1拿到了一個(gè)數(shù)據(jù)庫(kù)鎖,釋放鎖的時(shí)候拋出了異常沒釋放掉。

  • 避免死鎖的幾種方法:
    1.盡量避免一個(gè)線程同時(shí)獲取多個(gè)鎖。
    2.盡量避免一個(gè)線程同時(shí)占據(jù)多個(gè)支援,盡量一個(gè)線程同時(shí)只占據(jù)一個(gè)資源。
    3.嘗試使用定時(shí)鎖。Lock.tryLock(timeout)來代替使用內(nèi)部鎖機(jī)制。
    4.對(duì)于數(shù)據(jù)庫(kù)鎖,加鎖和解鎖必須在一個(gè)數(shù)據(jù)庫(kù)連接里進(jìn)行。

關(guān)于java死鎖介紹及避免方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI