摘要:我們知道,的作用其實是對類的和的增強,是為了讓線程在指定對象上等待,是一種線程之間進行協調的工具。當線程調用對象的方法時,必須拿到和這個對象關聯的鎖。
本文首發于一世流云的專欄:https://segmentfault.com/blog...一、ReentrantReadWriteLock類簡介
ReentrantReadWriteLock類,顧名思義,是一種讀寫鎖,它是ReadWriteLock接口的直接實現,該類在內部實現了具體獨占鎖特點的寫鎖,以及具有共享鎖特點的讀鎖,和ReentrantLock一樣,ReentrantReadWriteLock類也是通過定義內部類實現AQS框架的API來實現獨占/共享的功能。
ReentrantReadWriteLock類具有如下特點:
1.1 支持公平/非公平策略與ReadWriteLock類一樣,ReentrantReadWriteLock對象在構造時,可以傳入參數指定是公平鎖還是非公平鎖。
同一讀線程在獲取了讀鎖后還可以獲取讀鎖;
同一寫線程在獲取了寫鎖之后既可以再次獲取寫鎖又可以獲取讀鎖;
1.3 支持鎖降級所謂鎖降級,就是:先獲取寫鎖,然后獲取讀鎖,最后釋放寫鎖,這樣寫鎖就降級成了讀鎖。但是,讀鎖不能升級到寫鎖。簡言之,就是:
寫鎖可以降級成讀鎖,讀鎖不能升級成寫鎖。1.4 Condition條件支持
ReentrantReadWriteLock的內部讀鎖類、寫鎖類實現了Lock接口,所以可以通過newCondition()方法獲取Condition對象。但是這里要注意,讀鎖是沒法獲取Condition對象的,讀鎖調用newCondition() 方法會直接拋出UnsupportedOperationException。
我們知道,condition的作用其實是對Object類的wait()和notify()的增強,是為了讓線程在指定對象上等待,是一種線程之間進行協調的工具。1.5 使用示例
當線程調用condition對象的await方法時,必須拿到和這個condition對象關聯的鎖。由于線程對讀鎖的訪問是不受限制的(在寫鎖未被占用的情況下),那么即使拿到了和讀鎖關聯的condition對象也是沒有意義的,因為讀線程之前不需要進行協調。
以下是Oracle官方給出的一個例子:
使用ReentrantReadWriteLock控制對TreeMap的訪問(利用讀鎖控制讀操作的訪問,利用寫鎖控制修改操作的訪問),將TreeMap包裝成一個線程安全的集合,并且利用了讀寫鎖的特性來提高并發訪問。
public class RWTreeMap { private final Map二、ReentrantReadWriteLock類/方法聲明 2.1 類聲明m = new TreeMap (); private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); ? public Data get(String key) { r.lock(); try { return m.get(key); } finally { r.unlock(); } } ? public String[] allKeys() { r.lock(); try { return (String[]) m.keySet().toArray(); } finally { r.unlock(); } } ? public Data put(String key, Data value) { w.lock(); try { return m.put(key, value); } finally { w.unlock(); } } ? public void clear() { w.lock(); try { m.clear(); } finally { w.unlock(); } } }
內部嵌套類聲明:
ReentrantReadWriteLock類有兩個內部嵌套類ReadLock和WriteLock,這兩個內部類的實例會在ReentrantReadWriteLock類的構造器中創建,并通過ReentrantReadWriteLock類的readLock()和writeLock()方法訪問。
ReadLock:
WriteLock:
ReentrantReadWriteLock類的核心方法其實就兩個:readLock()和writeLock(),其它都是一些用來監控系統狀態的方法,返回的都是某一時刻點的近似值。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71525.html
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發于一世流云專欄:https...
摘要:關于,最后有兩點規律需要注意當的等待隊列隊首結點是共享結點,說明當前寫鎖被占用,當寫鎖釋放時,會以傳播的方式喚醒頭結點之后緊鄰的各個共享結點。當的等待隊列隊首結點是獨占結點,說明當前讀鎖被使用,當讀鎖釋放歸零后,會喚醒隊首的獨占結點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發于一世流云的專欄:...
摘要:公平策略在多個線程爭用鎖的情況下,公平策略傾向于將訪問權授予等待時間最長的線程。使用方式的典型調用方式如下二類原理的源碼非常簡單,它通過內部類實現了框架,接口的實現僅僅是對的的簡單封裝,參見原理多線程進階七鎖框架獨占功能剖析 showImg(https://segmentfault.com/img/remote/1460000016012582); 本文首發于一世流云的專欄:https...
摘要:但是,有些操作會依賴于對象的變化過程,此時的解決思路一般就是使用版本號。在變量前面追加上版本號,每次變量更新的時候把版本號加一,那么就會變成。四的引入就是上面所說的加了版本號的。 showImg(https://segmentfault.com/img/remote/1460000016012188); 本文首發于一世流云的專欄:https://segmentfault.com/blo...
摘要:線程可以調用的方法進入阻塞,當計數值降到時,所有之前調用阻塞的線程都會釋放。注意的初始計數值一旦降到,無法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、CountDownLatch簡介 CountDow...
閱讀 3708·2021-10-18 13:34
閱讀 2396·2021-08-11 11:15
閱讀 1201·2019-08-30 15:44
閱讀 687·2019-08-26 10:32
閱讀 986·2019-08-26 10:13
閱讀 2065·2019-08-23 18:36
閱讀 1775·2019-08-23 18:35
閱讀 523·2019-08-23 17:10