java.util.concurrent.locks.ReadWriteLock 源碼: html
package java.util.concurrent.locks; public interface ReadWriteLock { Lock readLock(); Lock writeLock(); }
全部已知實現類:
ReentrantReadWriteLock
java
ReadWriteLock 維護了一對相關的鎖,一個用於只讀操做,另外一個用於寫入操做。只要沒有 writer,讀取鎖 能夠由多個 reader 線程同時保持。寫入鎖 是獨佔的。成功獲取讀鎖的線程會看到寫入鎖以前版本所作的全部更新。api
與互斥鎖相比,讀-寫鎖 容許對共享數據進行更高級別的併發訪問。雖然一次只有一個線程(writer 線程)能夠修改共享數據,但在許多狀況下,任何數量的線程能夠同時讀取共享數據(reader 線程)。從理論上講,與互斥鎖相比,使用讀-寫鎖所容許的併發性加強將帶來更大的性能提升。併發
與互斥鎖相比,使用讀-寫鎖可否提高性能則取決於讀寫操做期間讀取數據相對於修改數據的頻率,以及數據的爭用——即在同一時間試圖對該數據執行讀取或寫入操做的線程數。性能
例如,某個最初用數據填充而且以後不常常對其進行修改的 collection,由於常常對其進行搜索(好比搜索某種目錄),因此這樣的 collection 是使用讀-寫鎖的理想候選者。可是,若是數據更新變得頻繁,數據在大部分時間都被寫入鎖 獨佔,這時,就算存在併發性加強,也是微不足道的。更進一步地說,若是讀取操做所用時間過短,則讀-寫鎖實現(它自己就比互斥鎖複雜)的開銷將成爲主要的執行成本。最終,只有經過分析和測量,才能肯定應用程序是否適合使用讀-寫鎖。spa
儘管讀-寫鎖的基本操做是直截了當的,但實現仍然必須做出許多決策,這些決策可能會影響給定應用程序中讀-寫鎖的效果。這些策略的例子包括:.net
Lock |
readLock() 返回用於讀取操做的鎖。 |
Lock |
writeLock() 返回用於寫入操做的鎖。 |
Lock readLock()
返回:
用於讀取操做的鎖。
線程
Lock writeLock()
返回:
用於寫入操做的鎖。code