【高併發】ReadWriteLock怎麼和快取扯上關係了?!
阿新 • • 發佈:2021-01-23
## 寫在前面
在實際工作中,有一種非常普遍的併發場景:那就是讀多寫少的場景。在這種場景下,為了優化程式的效能,我們經常使用快取來提高應用的訪問效能。因為快取非常適合使用在讀多寫少的場景中。而在併發場景中,Java SDK中提供了ReadWriteLock來滿足讀多寫少的場景。本文我們就來說說使用ReadWriteLock如何實現一個通用的快取中心。
本文涉及的知識點有:
![](https://img-blog.csdnimg.cn/20210119200727183.png)
文章已收錄到:
[https://github.com/sunshinelyz/technology-binghe](https://github.com/sunshinelyz/technology-binghe)
[https://gitee.com/binghe001/technology-binghe](https://gitee.com/binghe001/technology-binghe)
## 讀寫鎖
說起讀寫鎖,相信小夥伴們並不陌生。總體來說,讀寫鎖需要遵循以下原則:
* 一個共享變數允許同時被多個讀執行緒讀取到。
* 一個共享變數在同一時刻只能被一個寫執行緒進行寫操作。
* 一個共享變數在被寫執行緒執行寫操作時,此時這個共享變數不能被讀執行緒執行讀操作。
**這裡,需要小夥伴們注意的是:讀寫鎖和互斥鎖的一個重要的區別就是:讀寫鎖允許多個執行緒同時讀共享變數,而互斥鎖不允許。所以,在高併發場景下,讀寫鎖的效能要高於互斥鎖。但是,讀寫鎖的寫操作是互斥的,也就是說,使用讀寫鎖時,一個共享變數在被寫執行緒執行寫操作時,此時這個共享變數不能被讀執行緒執行讀操作。**
讀寫鎖支援公平模式和非公平模式,具體是在`ReentrantReadWriteLock`的構造方法中傳遞一個boolean型別的變數來控制。
```java
public ReentrantReadWriteLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
readerLock = new ReadLock(this);
writerLock = new WriteLock(this);
}
```
**另外,需要注意的一點是:在讀寫鎖中,讀鎖呼叫newCondition()會丟擲UnsupportedOperationException異常,也就是說:讀鎖不支援條件變數。**
## 快取實現
這裡,我們使用ReadWriteLock快速實現一個快取的通用工具類,總體程式碼如下所示。
```java
public class ReadWriteL