ReentrantReadWriteLock读写锁底层实现、StampLock详解

这篇具有很好参考价值的文章主要介绍了ReentrantReadWriteLock读写锁底层实现、StampLock详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读写锁、StampLock详解

ReentrantReadWriteLock

简介

适用于读多写少的场景,特点是读读不互斥,读写与写写互斥。



基本使用

private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock r = readWriteLock.readLock();
private Lock w = readWriteLock.writeLock();

// 读操作上读锁
public Data get(String key) {
   
  r.lock();
  try {
    
      // TODO 业务逻辑
  }finally {
    
       r.unlock(); 
   }
}

// 写操作上写锁
public Data put(String key, Data value) {
   
  w.lock();
  try {
    
      // TODO 业务逻辑
  }finally {
    
       w.unlock(); 
   }
}



整体结构

读写锁有一个顶层规范接口ReadWriteLock

public interface ReadWriteLock {
   

    Lock readLock();

    Lock writeLock();
}

我们常用的ReentrantReadWriteLock,它就实现了ReadWriteLock接口,并创建了两个内部类分别代表读锁和写锁。同时还有公平锁与非公平锁

public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable {
   
    private static final long serialVersionUID = -6992448646407690164L;
    
    /** 读锁 */
    private final ReentrantReadWriteLock.ReadLock readerLock;
    /** 写锁 */
    private final ReentrantReadWriteLock.WriteLock writerLock;
    /** 同步器 同时还定义了三个内部类,用来满足公平锁与非公平锁的实现*/
    final Sync sync;

    public ReentrantReadWriteLock() {
   
        this(false);
    }

    public ReentrantReadWriteLock(boolean fair) {
   
        // 同步器 公平锁与非公平锁
        // 这里先创建好了sync对象,然后再传给读写锁,为读写锁中的sync属性赋值
        sync = fair ? new FairSync() : new NonfairSync();
        // 读写锁
        readerLock = new ReadLock(this);
        writerLock = new WriteLock(this);
    }

    // 实现ReadWriteLock接口,重写的两个方法
    public ReentrantReadWriteLock.WriteLock writeLock() {
    return writerLock; }
    public ReentrantReadWriteLock.ReadLock  readLock()  {
    return readerLock; }
    
    ......
}



ReentrantReadWriteLock结构如下图所示,定义了五个内部类

ReentrantReadWriteLock读写锁底层实现、StampLock详解



读锁与写锁

Sync类继承了AbstractQueuedSynchronizer类,而公平锁与非公平锁的两个类继承了Sync

而读锁与写锁则是实现了Lock接口

读锁:文章来源地址https://www.toymoban.com/news/detail-403205.html

到了这里,关于ReentrantReadWriteLock读写锁底层实现、StampLock详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch底层读写工作原理

    目录 ES底层读写工作原理分析 ES写入数据的过程 ES读取数据的过程 根据id查询数据的过程 根据查询数据的过程 写数据底层原理          写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

    2024年02月21日
    浏览(35)
  • IIC通信过程详解以及底层代码实现

    I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。此通信方式为半双工。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为

    2024年02月01日
    浏览(28)
  • 【C++】中的vector使用详解及重要部分底层实现

           本篇文章会对vector的语法使用进行详解。同时,还会对重要难点部分的底层实现进行讲解。其中有vector的 迭代器失效 和 深拷贝 问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C++中的动态数组容器vector  二、vector的

    2024年02月15日
    浏览(26)
  • C++中的vector使用详解及重要部分底层实现

           本篇文章会对vector的语法使用进行详解。同时,还会对重要难点部分的底层实现进行讲解。其中有vector的 迭代器失效 和 深拷贝 问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C++中的动态数组容器vector  二、vector的

    2024年02月12日
    浏览(38)
  • C++中String的语法及常用接口的底层实现详解

      在C语言中,我们知道处理 字符串所用的类型是 char []或者char* 。字符串是以‘\\0’结尾的。在C++中,string 是一个标准库类(class), 用于处理字符串 。它提供了一种更高级、更便捷的字符串操作方式,string 类提供了一系列成员函数和重载运算符,以便于对字符串进行操作

    2024年02月10日
    浏览(31)
  • Cortex-M3/M4内核NVIC及HAL库函数详解(2):HAL库中断底层函数实现

    Keil uVision5 Cortex M3权威指南(中文) Cortex M3与M4权威指南 stm32f407的HAL库工程 STM32F4xx中文参考手册 打开stm32f407的HAL库工程,可以在CMSIS-Include-core_cm4.h内找到有关NVIC寄存器设置的相关函数: 该函数操作步骤如下: (1)读取SCB-AIRCR旧值,保存到reg_value (2)将reg_value的bit31-16(访

    2024年01月20日
    浏览(41)
  • 深入ReentrantReadWriteLock

    首先synchronized和ReentrantLock都是互斥锁,一个线程在获取锁资源之后另一个线程只能等待 假设有一种情况是读多写少,并且确保线程安全。可以使用ReentrantReadWriteLock实现 ReentrantReadWriteLock的特点是读读不互斥,可以并发执行;读写操作则是互斥的。 读读锁效果演示 写读锁效果

    2024年02月07日
    浏览(26)
  • 【容器底层技术】 namespaces详解

    namespaces是 Linux 内核的一项功能,它 对内核资源进行隔离 ,让一组进程只能看到与自己相关的一部分资源,而另一组进程看到另一组资源, 使得处于不同 namespaces 的进程拥有独立的全局系统资源,改变一个 namespaces 中的系统资源只会影响当前 namespaces 里的进程,对其他 nam

    2024年02月07日
    浏览(42)
  • redis 底层数据结构详解

    目录   1.字符串 1.1 SDS定义 1.2 SDS1好处 2.列表 2.1 void 实现多态 3 字典 3.1   底层实现是hash表 3.2 字典结构 3.3 哈希算法 3.3.1 rehash 3.3.2 rehash的触发时机 3.3.3 渐进式rehash 扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式

    2023年04月09日
    浏览(34)
  • 【C++】详解多态的底层原理

    上一篇文章我们学习了多态的语法,想必大家都会有很多疑问,这篇文章,我们就来带大家看看多态是如何实现的,它底层的原理是怎样的… 需要声明的,本文中的代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。 如果要其他平台下,部分代码需要改动。比如:

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包