摘要:我們知道,的作用其實(shí)是對(duì)類的和的增強(qiáng),是為了讓線程在指定對(duì)象上等待,是一種線程之間進(jìn)行協(xié)調(diào)的工具。當(dāng)線程調(diào)用對(duì)象的方法時(shí),必須拿到和這個(gè)對(duì)象關(guān)聯(lián)的鎖。
本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog...一、ReentrantReadWriteLock類簡(jiǎn)介
ReentrantReadWriteLock類,顧名思義,是一種讀寫鎖,它是ReadWriteLock接口的直接實(shí)現(xiàn),該類在內(nèi)部實(shí)現(xiàn)了具體獨(dú)占鎖特點(diǎn)的寫鎖,以及具有共享鎖特點(diǎn)的讀鎖,和ReentrantLock一樣,ReentrantReadWriteLock類也是通過定義內(nèi)部類實(shí)現(xiàn)AQS框架的API來實(shí)現(xiàn)獨(dú)占/共享的功能。
ReentrantReadWriteLock類具有如下特點(diǎn):
1.1 支持公平/非公平策略與ReadWriteLock類一樣,ReentrantReadWriteLock對(duì)象在構(gòu)造時(shí),可以傳入?yún)?shù)指定是公平鎖還是非公平鎖。
同一讀線程在獲取了讀鎖后還可以獲取讀鎖;
同一寫線程在獲取了寫鎖之后既可以再次獲取寫鎖又可以獲取讀鎖;
1.3 支持鎖降級(jí)所謂鎖降級(jí),就是:先獲取寫鎖,然后獲取讀鎖,最后釋放寫鎖,這樣寫鎖就降級(jí)成了讀鎖。但是,讀鎖不能升級(jí)到寫鎖。簡(jiǎn)言之,就是:
寫鎖可以降級(jí)成讀鎖,讀鎖不能升級(jí)成寫鎖。1.4 Condition條件支持
ReentrantReadWriteLock的內(nèi)部讀鎖類、寫鎖類實(shí)現(xiàn)了Lock接口,所以可以通過newCondition()方法獲取Condition對(duì)象。但是這里要注意,讀鎖是沒法獲取Condition對(duì)象的,讀鎖調(diào)用newCondition() 方法會(huì)直接拋出UnsupportedOperationException。
我們知道,condition的作用其實(shí)是對(duì)Object類的wait()和notify()的增強(qiáng),是為了讓線程在指定對(duì)象上等待,是一種線程之間進(jìn)行協(xié)調(diào)的工具。1.5 使用示例
當(dāng)線程調(diào)用condition對(duì)象的await方法時(shí),必須拿到和這個(gè)condition對(duì)象關(guān)聯(lián)的鎖。由于線程對(duì)讀鎖的訪問是不受限制的(在寫鎖未被占用的情況下),那么即使拿到了和讀鎖關(guān)聯(lián)的condition對(duì)象也是沒有意義的,因?yàn)樽x線程之前不需要進(jìn)行協(xié)調(diào)。
以下是Oracle官方給出的一個(gè)例子:
使用ReentrantReadWriteLock控制對(duì)TreeMap的訪問(利用讀鎖控制讀操作的訪問,利用寫鎖控制修改操作的訪問),將TreeMap包裝成一個(gè)線程安全的集合,并且利用了讀寫鎖的特性來提高并發(fā)訪問。
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(); } } }
內(nèi)部嵌套類聲明:
ReentrantReadWriteLock類有兩個(gè)內(nèi)部嵌套類ReadLock和WriteLock,這兩個(gè)內(nèi)部類的實(shí)例會(huì)在ReentrantReadWriteLock類的構(gòu)造器中創(chuàng)建,并通過ReentrantReadWriteLock類的readLock()和writeLock()方法訪問。
ReadLock:
WriteLock:
ReentrantReadWriteLock類的核心方法其實(shí)就兩個(gè):readLock()和writeLock(),其它都是一些用來監(jiān)控系統(tǒng)狀態(tài)的方法,返回的都是某一時(shí)刻點(diǎn)的近似值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71525.html
摘要:整個(gè)包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設(shè)計(jì)模式,設(shè)計(jì)了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)等進(jìn)行補(bǔ)充增強(qiáng)。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:關(guān)于,最后有兩點(diǎn)規(guī)律需要注意當(dāng)?shù)牡却?duì)列隊(duì)首結(jié)點(diǎn)是共享結(jié)點(diǎn),說明當(dāng)前寫鎖被占用,當(dāng)寫鎖釋放時(shí),會(huì)以傳播的方式喚醒頭結(jié)點(diǎn)之后緊鄰的各個(gè)共享結(jié)點(diǎn)。當(dāng)?shù)牡却?duì)列隊(duì)首結(jié)點(diǎn)是獨(dú)占結(jié)點(diǎn),說明當(dāng)前讀鎖被使用,當(dāng)讀鎖釋放歸零后,會(huì)喚醒隊(duì)首的獨(dú)占結(jié)點(diǎn)。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發(fā)于一世流云的專欄:...
摘要:公平策略在多個(gè)線程爭(zhēng)用鎖的情況下,公平策略傾向于將訪問權(quán)授予等待時(shí)間最長(zhǎng)的線程。使用方式的典型調(diào)用方式如下二類原理的源碼非常簡(jiǎn)單,它通過內(nèi)部類實(shí)現(xiàn)了框架,接口的實(shí)現(xiàn)僅僅是對(duì)的的簡(jiǎn)單封裝,參見原理多線程進(jìn)階七鎖框架獨(dú)占功能剖析 showImg(https://segmentfault.com/img/remote/1460000016012582); 本文首發(fā)于一世流云的專欄:https...
摘要:但是,有些操作會(huì)依賴于對(duì)象的變化過程,此時(shí)的解決思路一般就是使用版本號(hào)。在變量前面追加上版本號(hào),每次變量更新的時(shí)候把版本號(hào)加一,那么就會(huì)變成。四的引入就是上面所說的加了版本號(hào)的。 showImg(https://segmentfault.com/img/remote/1460000016012188); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blo...
摘要:線程可以調(diào)用的方法進(jìn)入阻塞,當(dāng)計(jì)數(shù)值降到時(shí),所有之前調(diào)用阻塞的線程都會(huì)釋放。注意的初始計(jì)數(shù)值一旦降到,無法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、CountDownLatch簡(jiǎn)介 CountDow...
閱讀 3721·2021-10-18 13:34
閱讀 2415·2021-08-11 11:15
閱讀 1209·2019-08-30 15:44
閱讀 702·2019-08-26 10:32
閱讀 998·2019-08-26 10:13
閱讀 2072·2019-08-23 18:36
閱讀 1784·2019-08-23 18:35
閱讀 532·2019-08-23 17:10