摘要:類顧名思義是一種讀寫鎖它是接口的直接實現(xiàn)該類在內(nèi)部實現(xiàn)了具體獨占鎖特點的寫鎖以及具有共享鎖特點的讀鎖和一樣類也是通過定義內(nèi)部類實現(xiàn)框架的來實現(xiàn)獨占共享的功能屬于排他鎖這些鎖在同一時刻只允許一個線程進行訪問但是在大多數(shù)場景下大部分時間都是提供
ReentrantReadWriteLock 類, 顧名思義, 是一種讀寫鎖, 它是 ReadWriteLock 接口的直接實現(xiàn), 該類在內(nèi)部實現(xiàn)了具體獨占鎖特點的寫鎖, 以及具有共享鎖特點的讀鎖, 和 ReentrantLock 一樣, ReentrantReadWriteLock 類也是通過定義內(nèi)部類實現(xiàn)AQS框架的API來實現(xiàn)獨占/共享的功能.
ReentrantLock 屬于排他鎖, 這些鎖在同一時刻只允許一個線程進行訪問, 但是在大多數(shù)場景下, 大部分時間都是提供讀服務(wù), 而寫服務(wù)占有的時間較少. 而且, 讀服務(wù)不存在數(shù)據(jù)競爭問題, 如果一個線程在讀時禁止其他線程讀勢必會導(dǎo)致性能降低. 所以就提供了讀寫鎖.
讀寫鎖維護著一對鎖, 一個讀鎖和一個寫鎖. 通過分離讀鎖和寫鎖, 使得并發(fā)性比一般的排他鎖有了較大的提升:
在同一時間, 可以允許多個讀線程同時訪問.
但是, 在寫線程訪問時, 所有讀線程和寫線程都會被阻塞.
讀寫鎖的主要特性:
公平性:支持公平性和非公平性.
重入性:支持重入. 讀寫鎖最多支持 65535 個遞歸寫入鎖和 65535 個遞歸讀取鎖.
鎖降級:遵循獲取寫鎖, 再獲取讀鎖, 最后釋放寫鎖的次序, 如此寫鎖能夠降級成為讀鎖.
ReadWriteLock讀寫鎖 ReentrantReadWriteLock 實現(xiàn)接口 ReadWriteLock, 該接口維護了一對相關(guān)的鎖, 一個用于只讀操作, 另一個用于寫入操作. 只要沒有 writer, 讀取鎖可以由多個 reader 線程同時保持. 寫入鎖是獨占的.
public interface ReadWriteLock { Lock readLock(); Lock writeLock(); }
ReadWriteLock 定義了兩個方法. readLock() 返回用于讀操作的鎖, writeLock() 返回用于寫操作的鎖.
ReentrantReadWriteLockjava.util.concurrent.locks.ReentrantReadWriteLock 定義如下.
/** 內(nèi)部類 讀鎖 */ private final ReentrantReadWriteLock.ReadLock readerLock; /** 內(nèi)部類 寫鎖 */ private final ReentrantReadWriteLock.WriteLock writerLock; final Sync sync; /** 使用默認(非公平)的排序?qū)傩詣?chuàng)建一個新的 ReentrantReadWriteLock */ public ReentrantReadWriteLock() { this(false); } /** 使用給定的公平策略創(chuàng)建一個新的 ReentrantReadWriteLock */ public ReentrantReadWriteLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); readerLock = new ReadLock(this); writerLock = new WriteLock(this); } /** 返回用于寫入操作的鎖 */ @Override public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; } /** 返回用于讀取操作的鎖 */ @Override public ReentrantReadWriteLock.ReadLock readLock() { return readerLock; } abstract static class Sync extends AbstractQueuedSynchronizer { /** * 省略其余源代碼 */ } public static class WriteLock implements Lock, java.io.Serializable { /** * 省略其余源代碼 */ } public static class ReadLock implements Lock, java.io.Serializable { /** * 省略其余源代碼 */ }
ReentrantReadWriteLock 與 ReentrantLock 一樣, 其鎖主體依然是 Sync, 它的讀鎖、寫鎖都是依靠 Sync 來實現(xiàn)的.
所以 ReentrantReadWriteLock 實際上只有一個鎖, 只是在獲取讀取鎖和寫入鎖的方式上不一樣而已, 它的讀寫鎖其實就是兩個類: ReadLock、writeLock, 這兩個類都是lock實現(xiàn).
在 ReentrantLock 中, 使用 Sync ( 實際是 AQS ) 的 int 類型的 state 來表示同步狀態(tài), 表示鎖被一個線程重復(fù)獲取的次數(shù).
但是, 讀寫鎖 ReentrantReadWriteLock 內(nèi)部維護著一對讀寫鎖, 如果要用一個變量維護多種狀態(tài), 需要采用 “按位切割使用” 的方式來維護這個變量, 將其切分為兩部分: 高16為表示讀, 低16為表示寫.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77515.html
摘要:我們知道,的作用其實是對類的和的增強,是為了讓線程在指定對象上等待,是一種線程之間進行協(xié)調(diào)的工具。當(dāng)線程調(diào)用對象的方法時,必須拿到和這個對象關(guān)聯(lián)的鎖。 showImg(https://segmentfault.com/img/remote/1460000016012566); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、Reentr...
摘要:不同的是它還多了內(nèi)部類和內(nèi)部類,以及讀寫對應(yīng)的成員變量和方法。另外是給和內(nèi)部類使用的。內(nèi)部類前面說到的操作是分配到里面執(zhí)行的。他們都是接口的實現(xiàn),所以其實最像應(yīng)該是這個兩個內(nèi)部類。而且大體上也沒什么差異,也是用的內(nèi)部類。 之前講了《AQS源碼閱讀》和《ReentrantLock源碼閱讀》,本次將延續(xù)閱讀下ReentrantReadWriteLock,建議沒看過之前兩篇文章的,先大概了解...
摘要:關(guān)于,最后有兩點規(guī)律需要注意當(dāng)?shù)牡却犃嘘犑捉Y(jié)點是共享結(jié)點,說明當(dāng)前寫鎖被占用,當(dāng)寫鎖釋放時,會以傳播的方式喚醒頭結(jié)點之后緊鄰的各個共享結(jié)點。當(dāng)?shù)牡却犃嘘犑捉Y(jié)點是獨占結(jié)點,說明當(dāng)前讀鎖被使用,當(dāng)讀鎖釋放歸零后,會喚醒隊首的獨占結(jié)點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發(fā)于一世流云的專欄:...
摘要:前言回顧前面多線程三分鐘就可以入個門了源碼剖析多線程基礎(chǔ)必要知識點看了學(xué)習(xí)多線程事半功倍鎖機制了解一下簡簡單單過一遍只有光頭才能變強上一篇已經(jīng)將鎖的基礎(chǔ)簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個子類那么接下來我們就開始吧一鎖首先我們來 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍 Java鎖機制了解一下 AQ...
摘要:所以就有了讀寫鎖。只要沒有,讀取鎖可以由多個線程同時保持。其讀寫鎖為兩個內(nèi)部類都實現(xiàn)了接口。讀寫鎖同樣依賴自定義同步器來實現(xiàn)同步狀態(tài)的,而讀寫狀態(tài)就是其自定義同步器的狀態(tài)。判斷申請寫鎖數(shù)量是否超標(biāo)超標(biāo)則直接異常,反之則設(shè)置共享狀態(tài)。 一、寫在前面 在上篇我們聊到了可重入鎖(排它鎖)ReentrantLcok ,具體參見《J.U.C|可重入鎖ReentrantLock》 Reentra...
閱讀 3843·2021-11-25 09:43
閱讀 2184·2021-11-23 10:11
閱讀 1413·2021-09-29 09:35
閱讀 1359·2021-09-24 10:31
閱讀 2048·2019-08-30 15:48
閱讀 2366·2019-08-29 15:28
閱讀 439·2019-08-29 12:36
閱讀 3499·2019-08-28 18:12