今天小編給大家分享的是java死鎖介紹及避免方法,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、山陽網(wǎng)絡(luò)推廣、小程序制作、山陽網(wǎng)絡(luò)營銷、山陽企業(yè)策劃、山陽品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供山陽建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
死鎖的介紹:
鎖是一個(gè)非常有用的工具,運(yùn)行場(chǎng)景非常多,因?yà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))?;蛘遲1拿到了一個(gè)數(shù)據(jù)庫鎖,釋放鎖的時(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ù)庫鎖,加鎖和解鎖必須在一個(gè)數(shù)據(jù)庫連接里進(jìn)行。
關(guān)于java死鎖介紹及避免方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。