接口: ReadWriteLockspa
接口定義的方法就是:readLock()和writeLock();.net
接口源碼:線程
public interface ReadWriteLock {
/**
* Returns the lock used for reading.
*
* @return the lock used for reading.
*/
Lock readLock();遞歸
/**
* Returns the lock used for writing.
*
* @return the lock used for writing.
*/
Lock writeLock();
}接口
它的實現類是:ReentrantReadWriteLock.隊列
ReentrantReadWriteLock的特性:get
- 公平性
- 非公平鎖(默認) 這個和獨佔鎖的非公平性同樣,因爲讀線程之間沒有鎖競爭,因此讀操做沒有公平性和非公平性,寫操做時,因爲寫操做可能當即獲取到鎖,因此會推遲一個或多個讀操做或者寫操做。所以非公平鎖的吞吐量要高於公平鎖。
- 公平鎖 利用AQS的CLH隊列,釋放當前保持的鎖(讀鎖或者寫鎖)時,優先爲等待時間最長的那個寫線程分配寫入鎖,當前前提是寫線程的等待時間要比全部讀線程的等待時間要長。一樣一個線程持有寫入鎖或者有一個寫線程已經在等待了,那麼試圖獲取公平鎖的(非重入)全部線程(包括讀寫線程)都將被阻塞,直到最早的寫線程釋放鎖。若是讀線程的等待時間比寫線程的等待時間還有長,那麼一旦上一個寫線程釋放鎖,這一組讀線程將獲取鎖。
- 重入性
- 讀寫鎖容許讀線程和寫線程按照請求鎖的順序從新獲取讀取鎖或者寫入鎖。固然了只有寫線程釋放了鎖,讀線程才能獲取重入鎖。
- 寫線程獲取寫入鎖後能夠再次獲取讀取鎖,可是讀線程獲取讀取鎖後卻不能獲取寫入鎖。
- 另外讀寫鎖最多支持65535個遞歸寫入鎖和65535個遞歸讀取鎖。
- 鎖降級
- 寫線程獲取寫入鎖後能夠獲取讀取鎖,而後釋放寫入鎖,這樣就從寫入鎖變成了讀取鎖,從而實現鎖降級的特性。
- 鎖升級
- 讀取鎖是不能直接升級爲寫入鎖的。由於獲取一個寫入鎖須要釋放全部讀取鎖,因此若是有兩個讀取鎖視圖獲取寫入鎖而都不釋放讀取鎖時就會發生死鎖。
- 鎖獲取中斷
- 讀取鎖和寫入鎖都支持獲取鎖期間被中斷。這個和獨佔鎖一致。
- 條件變量
- 寫入鎖提供了條件變量(Condition)的支持,這個和獨佔鎖一致,可是讀取鎖卻不容許獲取條件變量,將獲得一個UnsupportedOperationException異常。
- 重入數
- 讀取鎖和寫入鎖的數量最大分別只能是65535(包括重入數)。