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