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

資訊專欄INFORMATION COLUMN

ReentrantReadWriteLock 類

zsirfs / 2440人閱讀

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

ReentrantReadWriteLock 類, 顧名思義, 是一種讀寫鎖, 它是 ReadWriteLock 接口的直接實現, 該類在內部實現了具體獨占鎖特點的寫鎖, 以及具有共享鎖特點的讀鎖, 和 ReentrantLock 一樣, ReentrantReadWriteLock 類也是通過定義內部類實現AQS框架的API來實現獨占/共享的功能.

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

讀寫鎖維護著一對鎖, 一個讀鎖和一個寫鎖. 通過分離讀鎖和寫鎖, 使得并發性比一般的排他鎖有了較大的提升:

在同一時間, 可以允許多個讀線程同時訪問.

但是, 在寫線程訪問時, 所有讀線程和寫線程都會被阻塞.

讀寫鎖的主要特性:

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

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

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

ReadWriteLock

讀寫鎖 ReentrantReadWriteLock 實現接口 ReadWriteLock, 該接口維護了一對相關的鎖, 一個用于只讀操作, 另一個用于寫入操作. 只要沒有 writer, 讀取鎖可以由多個 reader 線程同時保持. 寫入鎖是獨占的.

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

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

ReentrantReadWriteLock

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

/** 內部類  讀鎖 */
private final ReentrantReadWriteLock.ReadLock readerLock;
/** 內部類  寫鎖 */
private final ReentrantReadWriteLock.WriteLock writerLock;

final Sync sync;

/** 使用默認(非公平)的排序屬性創建一個新的 ReentrantReadWriteLock */
public ReentrantReadWriteLock() {
    this(false);
}

/** 使用給定的公平策略創建一個新的 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 來實現的.

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77515.html

相關文章

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

    摘要:我們知道,的作用其實是對類的和的增強,是為了讓線程在指定對象上等待,是一種線程之間進行協調的工具。當線程調用對象的方法時,必須拿到和這個對象關聯的鎖。 showImg(https://segmentfault.com/img/remote/1460000016012566); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、Reentr...

    kumfo 評論0 收藏0
  • Java多線程—ReentrantReadWriteLock源碼閱讀

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

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

    摘要:關于,最后有兩點規律需要注意當的等待隊列隊首結點是共享結點,說明當前寫鎖被占用,當寫鎖釋放時,會以傳播的方式喚醒頭結點之后緊鄰的各個共享結點。當的等待隊列隊首結點是獨占結點,說明當前讀鎖被使用,當讀鎖釋放歸零后,會喚醒隊首的獨占結點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發于一世流云的專欄:...

    dunizb 評論0 收藏0
  • Lock鎖子了解一下

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

    時飛 評論0 收藏0
  • J.U.C|讀-寫鎖ReentrantReadWriteLock

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

    Tonny 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<