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