国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ReentrantReadWriteLock 類

zsirfs / 2432人閱讀

摘要:類顧名思義是一種讀寫鎖它是接口的直接實(shí)現(xiàn)該類在內(nèi)部實(shí)現(xiàn)了具體獨(dú)占鎖特點(diǎn)的寫鎖以及具有共享鎖特點(diǎn)的讀鎖和一樣類也是通過定義內(nèi)部類實(shí)現(xiàn)框架的來實(shí)現(xiàn)獨(dú)占共享的功能屬于排他鎖這些鎖在同一時(shí)刻只允許一個(gè)線程進(jìn)行訪問但是在大多數(shù)場景下大部分時(shí)間都是提供

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ú)占/共享的功能.

ReentrantLock 屬于排他鎖, 這些鎖在同一時(shí)刻只允許一個(gè)線程進(jìn)行訪問, 但是在大多數(shù)場景下, 大部分時(shí)間都是提供讀服務(wù), 而寫服務(wù)占有的時(shí)間較少. 而且, 讀服務(wù)不存在數(shù)據(jù)競爭問題, 如果一個(gè)線程在讀時(shí)禁止其他線程讀勢(shì)必會(huì)導(dǎo)致性能降低. 所以就提供了讀寫鎖.

讀寫鎖維護(hù)著一對(duì)鎖, 一個(gè)讀鎖和一個(gè)寫鎖. 通過分離讀鎖和寫鎖, 使得并發(fā)性比一般的排他鎖有了較大的提升:

在同一時(shí)間, 可以允許多個(gè)讀線程同時(shí)訪問.

但是, 在寫線程訪問時(shí), 所有讀線程和寫線程都會(huì)被阻塞.

讀寫鎖的主要特性:

公平性:支持公平性和非公平性.

重入性:支持重入. 讀寫鎖最多支持 65535 個(gè)遞歸寫入鎖和 65535 個(gè)遞歸讀取鎖.

鎖降級(jí):遵循獲取寫鎖, 再獲取讀鎖, 最后釋放寫鎖的次序, 如此寫鎖能夠降級(jí)成為讀鎖.

ReadWriteLock

讀寫鎖 ReentrantReadWriteLock 實(shí)現(xiàn)接口 ReadWriteLock, 該接口維護(hù)了一對(duì)相關(guān)的鎖, 一個(gè)用于只讀操作, 另一個(gè)用于寫入操作. 只要沒有 writer, 讀取鎖可以由多個(gè) reader 線程同時(shí)保持. 寫入鎖是獨(dú)占的.

public interface ReadWriteLock {
    Lock readLock();
    Lock writeLock();
}

ReadWriteLock 定義了兩個(gè)方法. readLock() 返回用于讀操作的鎖, writeLock() 返回用于寫操作的鎖.

ReentrantReadWriteLock

java.util.concurrent.locks.ReentrantReadWriteLock 定義如下.

/** 內(nèi)部類  讀鎖 */
private final ReentrantReadWriteLock.ReadLock readerLock;
/** 內(nèi)部類  寫鎖 */
private final ReentrantReadWriteLock.WriteLock writerLock;

final Sync sync;

/** 使用默認(rèn)(非公平)的排序?qū)傩詣?chuàng)建一個(gè)新的 ReentrantReadWriteLock */
public ReentrantReadWriteLock() {
    this(false);
}

/** 使用給定的公平策略創(chuàng)建一個(gè)新的 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 {
    /**
     * 省略其余源代碼
     */
}

ReentrantReadWriteLockReentrantLock 一樣, 其鎖主體依然是 Sync, 它的讀鎖、寫鎖都是依靠 Sync 來實(shí)現(xiàn)的.

所以 ReentrantReadWriteLock 實(shí)際上只有一個(gè)鎖, 只是在獲取讀取鎖和寫入鎖的方式上不一樣而已, 它的讀寫鎖其實(shí)就是兩個(gè)類: ReadLockwriteLock, 這兩個(gè)類都是lock實(shí)現(xiàn).

ReentrantLock 中, 使用 Sync ( 實(shí)際是 AQS ) 的 int 類型的 state 來表示同步狀態(tài), 表示鎖被一個(gè)線程重復(fù)獲取的次數(shù).

但是, 讀寫鎖 ReentrantReadWriteLock 內(nèi)部維護(hù)著一對(duì)讀寫鎖, 如果要用一個(gè)變量維護(hù)多種狀態(tài), 需要采用 “按位切割使用” 的方式來維護(hù)這個(gè)變量, 將其切分為兩部分: 高16為表示讀, 低16為表示寫.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77515.html

相關(guān)文章

  • Java多線程進(jìn)階(四)—— J.U.C之locks框架:ReentrantReadWriteLoc

    摘要:我們知道,的作用其實(shí)是對(duì)類的和的增強(qiáng),是為了讓線程在指定對(duì)象上等待,是一種線程之間進(jìn)行協(xié)調(diào)的工具。當(dāng)線程調(diào)用對(duì)象的方法時(shí),必須拿到和這個(gè)對(duì)象關(guān)聯(lián)的鎖。 showImg(https://segmentfault.com/img/remote/1460000016012566); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、Reentr...

    kumfo 評(píng)論0 收藏0
  • Java多線程—ReentrantReadWriteLock源碼閱讀

    摘要:不同的是它還多了內(nèi)部類和內(nèi)部類,以及讀寫對(duì)應(yīng)的成員變量和方法。另外是給和內(nèi)部類使用的。內(nèi)部類前面說到的操作是分配到里面執(zhí)行的。他們都是接口的實(shí)現(xiàn),所以其實(shí)最像應(yīng)該是這個(gè)兩個(gè)內(nèi)部類。而且大體上也沒什么差異,也是用的內(nèi)部類。 之前講了《AQS源碼閱讀》和《ReentrantLock源碼閱讀》,本次將延續(xù)閱讀下ReentrantReadWriteLock,建議沒看過之前兩篇文章的,先大概了解...

    Ververica 評(píng)論0 收藏0
  • Java多線程進(jìn)階(十)—— J.U.C之locks框架:基于AQS的讀寫鎖(5)

    摘要:關(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ā)于一世流云的專欄:...

    dunizb 評(píng)論0 收藏0
  • Lock鎖子了解一下

    摘要:前言回顧前面多線程三分鐘就可以入個(gè)門了源碼剖析多線程基礎(chǔ)必要知識(shí)點(diǎn)看了學(xué)習(xí)多線程事半功倍鎖機(jī)制了解一下簡簡單單過一遍只有光頭才能變強(qiáng)上一篇已經(jīng)將鎖的基礎(chǔ)簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個(gè)子類那么接下來我們就開始吧一鎖首先我們來 前言 回顧前面: 多線程三分鐘就可以入個(gè)門了! Thread源碼剖析 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍 Java鎖機(jī)制了解一下 AQ...

    時(shí)飛 評(píng)論0 收藏0
  • J.U.C|讀-寫鎖ReentrantReadWriteLock

    摘要:所以就有了讀寫鎖。只要沒有,讀取鎖可以由多個(gè)線程同時(shí)保持。其讀寫鎖為兩個(gè)內(nèi)部類都實(shí)現(xiàn)了接口。讀寫鎖同樣依賴自定義同步器來實(shí)現(xiàn)同步狀態(tài)的,而讀寫狀態(tài)就是其自定義同步器的狀態(tài)。判斷申請(qǐng)寫鎖數(shù)量是否超標(biāo)超標(biāo)則直接異常,反之則設(shè)置共享狀態(tài)。 一、寫在前面 在上篇我們聊到了可重入鎖(排它鎖)ReentrantLcok ,具體參見《J.U.C|可重入鎖ReentrantLock》 Reentra...

    Tonny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<