1. 程式人生 > >【高併發】ReadWriteLock怎麼和快取扯上關係了?!

【高併發】ReadWriteLock怎麼和快取扯上關係了?!

## 寫在前面 在實際工作中,有一種非常普遍的併發場景:那就是讀多寫少的場景。在這種場景下,為了優化程式的效能,我們經常使用快取來提高應用的訪問效能。因為快取非常適合使用在讀多寫少的場景中。而在併發場景中,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