摘要:可重入的意思是線程可以重復(fù)獲得它已經(jīng)持有的鎖。如果一個(gè)線程持有某個(gè)管程對(duì)象上的鎖,那么它就有權(quán)訪問(wèn)所有在該管程對(duì)象上同步的塊。下面這個(gè)鎖的實(shí)現(xiàn)是不可重入的如果一個(gè)線程在兩次調(diào)用間沒(méi)有調(diào)用方法,那么第二次調(diào)用就會(huì)被阻塞,這就出現(xiàn)了重入鎖死。
重入鎖死與死鎖和嵌套管程鎖死非常相似。鎖和讀寫鎖兩篇文章中都有涉及到重入鎖死的問(wèn)題。
當(dāng)一個(gè)線程重新獲取鎖,讀寫鎖或其他不可重入的同步器時(shí),就可能發(fā)生重入鎖死??芍厝氲囊馑际蔷€程可以重復(fù)獲得它已經(jīng)持有的鎖。Java的synchronized塊是可重入的。因此下面的代碼是沒(méi)問(wèn)題的:
(譯者注:這里提到的鎖都是指的不可重入的鎖實(shí)現(xiàn),并不是Java類庫(kù)中的Lock與ReadWriteLock類)
public class Reentrant{ public synchronized outer(){ inner(); } public synchronized inner(){ //do something } }
注意outer()和inner()都聲明為synchronized,這在Java中這相當(dāng)于synchronized(this)塊(譯者注:這里兩個(gè)方法是實(shí)例方法,synchronized的實(shí)例方法相當(dāng)于在this上加鎖,如果是static方法,則不然,更多閱讀:哪個(gè)對(duì)象才是鎖?)。如果某個(gè)線程調(diào)用了outer(),outer()中的inner()調(diào)用是沒(méi)問(wèn)題的,因?yàn)閮蓚€(gè)方法都是在同一個(gè)管程對(duì)象(即this)上同步的。如果一個(gè)線程持有某個(gè)管程對(duì)象上的鎖,那么它就有權(quán)訪問(wèn)所有在該管程對(duì)象上同步的塊。這就叫可重入。若線程已經(jīng)持有鎖,那么它就可以重復(fù)訪問(wèn)所有使用該鎖的代碼塊。
下面這個(gè)鎖的實(shí)現(xiàn)是不可重入的:
public class Lock{ private boolean isLocked = false; public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } isLocked = true; } public synchronized void unlock(){ isLocked = false; notify(); } }
如果一個(gè)線程在兩次調(diào)用lock()間沒(méi)有調(diào)用unlock()方法,那么第二次調(diào)用lock()就會(huì)被阻塞,這就出現(xiàn)了重入鎖死。
避免重入鎖死有兩個(gè)選擇:
編寫代碼時(shí)避免再次獲取已經(jīng)持有的鎖
使用可重入鎖
至于哪個(gè)選擇最適合你的項(xiàng)目,得視具體情況而定??芍厝腈i通常沒(méi)有不可重入鎖那么好的表現(xiàn),而且實(shí)現(xiàn)起來(lái)復(fù)雜,但這些情況在你的項(xiàng)目中也許算不上什么問(wèn)題。無(wú)論你的項(xiàng)目用鎖來(lái)實(shí)現(xiàn)方便還是不用鎖方便,可重入特性都需要根據(jù)具體問(wèn)題具體分析。
原文 Reentrance Lockout
作者 Jakob Jenkov
譯者 劉曉日
校對(duì) 丁一
via ifeve
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64075.html
摘要:不可變?cè)谥?,不可變的?duì)象一定是線程安全的。在里標(biāo)注自己是線程安全的類,大多都不是絕對(duì)線程安全,比如某些情況下類在調(diào)用端也需要額外的同步措施。無(wú)同步方案要保證線程安全,不一定就得需要數(shù)據(jù)的同步,兩者沒(méi)有因果關(guān)系。 在之前學(xué)習(xí)編程的時(shí)候,有一個(gè)概念根深蒂固,即程序=算法+數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)代表問(wèn)題空間中的客體,代碼就用來(lái)處理這些數(shù)據(jù),這種思維是站在計(jì)算機(jī)的角度去抽象問(wèn)題和解決問(wèn)題,稱之為面向過(guò)...
摘要:參考何去何從的并行計(jì)算忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計(jì)十分復(fù)雜??膳碌默F(xiàn)實(shí)摩爾定律的失效單核上的晶體管數(shù)目達(dá)到極限。并發(fā)級(jí)別阻塞重入鎖無(wú)饑餓兩個(gè)線程優(yōu)先級(jí)不同,低優(yōu)先級(jí)的可能產(chǎn)生饑餓。 Chapter1 參考:https://github.com/chengbingh... 1.1何去何從的并行計(jì)算 1.1.1 忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計(jì)十...
摘要:簡(jiǎn)介是的線程安全版本,內(nèi)部也是使用數(shù)組鏈表紅黑樹的結(jié)構(gòu)來(lái)存儲(chǔ)元素。相比于同樣線程安全的來(lái)說(shuō),效率等各方面都有極大地提高。中的關(guān)鍵字,內(nèi)部實(shí)現(xiàn)為監(jiān)視器鎖,主要是通過(guò)對(duì)象監(jiān)視器在對(duì)象頭中的字段來(lái)表明的。 簡(jiǎn)介 ConcurrentHashMap是HashMap的線程安全版本,內(nèi)部也是使用(數(shù)組 + 鏈表 + 紅黑樹)的結(jié)構(gòu)來(lái)存儲(chǔ)元素。 相比于同樣線程安全的HashTable來(lái)說(shuō),效率等各方...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類,也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類,也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
閱讀 3348·2023-04-26 01:31
閱讀 1967·2023-04-25 22:08
閱讀 3628·2021-09-01 11:42
閱讀 2893·2019-08-30 12:58
閱讀 2253·2019-08-29 18:31
閱讀 2494·2019-08-29 17:18
閱讀 3122·2019-08-29 13:01
閱讀 2620·2019-08-28 18:22