深入ReentrantReadWriteLock

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

ReentrantReadWriteLock出现的原因

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

代码效果显示

/**
 * @author 舒一笑
 * @date 2023/6/1
 */
public class Test17 {

    static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    static ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
    static ReentrantReadWriteLock.ReadLock readLock =lock.readLock();

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            // 这里现在是读锁
            readLock.lock();
            try {
                System.out.println("子线程是读锁");
                Thread.sleep(50000000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }finally {
                readLock.unlock();
            }
        }).start();

        Thread.sleep(1000);
        // 这里现在也是读锁
        readLock.lock();
        try {
            System.out.println("主线程");
        } finally {
            readLock.unlock();
        }

    }
}
  • 读读锁效果演示
    深入ReentrantReadWriteLock

  • 写读锁效果演示
    深入ReentrantReadWriteLock

ReentrantReadWriteLock(重新输入读写锁定)锁的实现原理分析

  • 还是基于AQS实现,同样都是对state的操作。获取锁资源成功便执行判断之后的方法体逻辑,否则便会阻塞到AQS队列中去排队
    深入ReentrantReadWriteLock
    深入ReentrantReadWriteLock

  • 查看对AQS方法在ReentrantReadWriteLock中的实现可以知道

  • 读锁操作是基于state的高16位的操作

  • 写锁操作是基于state的低16位的操作,所以在锁重入的时候同样是对state的操作,但是范围却比小了
    深入ReentrantReadWriteLock
    深入ReentrantReadWriteLock

  • ReentrantReadWriteLock依旧是可重入锁
    深入ReentrantReadWriteLock

  • tryAcquire(int acquires)方法的分析

  • 当前线程不持有锁资源,c的值是0;尝试获取锁资源、CAS拿锁。
    深入ReentrantReadWriteLock
    深入ReentrantReadWriteLock

写锁释放锁流程和源码分析

深入ReentrantReadWriteLock
深入ReentrantReadWriteLock

  • tryRelease(arg)方法分析
    深入ReentrantReadWriteLock

读锁分析

  • 读锁加锁源码分析
  • 方法体里面没拿到锁资源就去排队
    深入ReentrantReadWriteLock

深入ReentrantReadWriteLock

  • tryAcquireShared(arg)方法分析

深入ReentrantReadWriteLock

  • 读锁重入流程分析
  • 读锁的重入主要就是基于下面这部分的源码的实现。
  • 通过对r是否为0的判断来证明当前是不是第一个拿到读锁资源的线程
  • 判断满足那么将firstRead置为当前线程。并将firstReadCount置为1
  • 要是第一个判断不满足。那么便会判断当前线程是不是第一个获取读锁资源的线程。要是是的话那么就会firstReadHoldcount++
  • 要是还是不满足那么就说明当前线程不是第一个获取读锁资源的线程。那就在方法体中获取最后一个拿到锁资源的线程。并判断当前线程是否是最后一个拿到读锁资源的线程。要是不是那就将当前线程设置为cachedHoldCounter。
  • 如果在最内部的判断中当前线程是之前的cachedHoldCounter,那就判断当前的重入次数是不是0,重新设置当前线程锁重入信息到readHolds,就是包装了ThreadLocal中,完成初始化操作。重入次数是0;将count次数++
    深入ReentrantReadWriteLock
  • 读锁加锁后续fullTryAcquireShared(current)方法分析
    深入ReentrantReadWriteLock
    深入ReentrantReadWriteLock
  • 读锁在获取锁资源之后doAcquireShared(arg)方法分析
    深入ReentrantReadWriteLock
    深入ReentrantReadWriteLock
  • setHeadAndPropagate(node, r);方法分析
    深入ReentrantReadWriteLock

读锁释放锁流程

深入ReentrantReadWriteLock
深入ReentrantReadWriteLock文章来源地址https://www.toymoban.com/news/detail-471767.html

  • doReleaseShared()方法分析
    深入ReentrantReadWriteLock

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

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

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

相关文章

  • 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

    阅读Spring官方文档,了解Spring框架的基本概念和使用方法。 下载Spring源码,可以从官网或者GitHub上获取。 阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。 阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。 调试Spring源码,可以通过

    2023年04月23日
    浏览(31)
  • 无主之地3出现UE4崩溃怎么办?无主之地3出现UE4崩溃深入解析原因及解决方案

    无主之地3(Borderlands 3)出现UE4崩溃,通常指的是游戏运行时基于虚幻引擎4(Unreal Engine 4,简称UE4)开发的部分出现崩溃现象。 下面一起来看看原因及解决方法介绍吧! 原因 1. 驱动程序问题:•显卡驱动程序过时或不兼容可能导致UE4崩溃。确保您的显卡驱动是最新的,并且

    2024年04月09日
    浏览(43)
  • win 11本地账户切换至microsoft账户 出现 哎呀,出现了错误

    使用win11内置系统管理员账户,导致无法登录微软账号 省流:新建本地用户可以解决 右键此电脑-管理-本地用户和组-用户-右键-新用户 如果你只有4个账户,或者登录的是Administrator这个内置账户,可以通过此方法解决 ps:我是用的是自己创建的Nouser账户 解决方案 ps: 有其他账

    2024年02月04日
    浏览(87)
  • el-table魔改样式出现BUG,表格内容区域出现滚动条

    代码排查后发现时我设置了 fixed:“xxx” 属性就会导致滚动条出现的问题,不设置则无。 设置 fixed:“xxx” 后elementui就会多渲染几个css。重点看bottom:-1px,这是官方设置的值。我发现重置为bottom:-0px,问题就能解决了,下面直接贴解决代码。 把样式放在全局CSS中 还有更好的方

    2024年02月02日
    浏览(29)
  • spring cloud gateway中出现503 spring cloud gateway中出现503

    当搭建网关模块的时候出现503的错误的最大的可能就是没有设置负载均衡的依赖包  原先搭建的时候采用的是下面的方式进行设置的 上面的这种方式可以直接进行注册和发现,但是要求必须导入下面的依赖 希望简单的随笔能够帮助你!

    2024年02月11日
    浏览(30)
  • RK356x之HDMI显示出现输出信号不稳定、花屏、出现红条纹现象

    芯片:rk356x系列 显示器: HDMI接口显示器 HDMI显示器接到控制板上可以显示,但是会出现时不时出现闪烁,红条纹(就好像之前我们家里大块电视上的条纹)。 猜想1:HDMI显示器可能坏了 猜想2: 电路板上的某些器件影响了HDMI输出信号 猜想3:HDMI线的长度也有可能导致信号输出不

    2024年02月12日
    浏览(30)
  • 解决百度地图的父元素出现滚轮之后启用鼠标缩放模式之后出现偏移的现象

    最近在做项目的时候,有个功能是点击详情按钮的时候在一个弹框里展现出来列表的详情 因为详情弹框里面的数据有其他的表格数据,然后在弹框的下边使用百度地图展示后端发送过来的坐标点,然后把坐标点转换之后使用百度地图的方法制作覆盖物上去。这里边就出现了一

    2024年03月18日
    浏览(33)
  • keil5出现‘Target not created‘ keil5出现‘Target not created‘

    新建工程中写了main函数进行编译时出现错误的问题: 查找报错的关键提示: cannot open source input file \\\"core_cm3.h\\\": No such file or directory   #include \\\"core_cm3.h\\\" 这是因为你装的MDK版本太新了,比如MDK5.12/5.13,它们不会从MDK安装目录去查找头文件。 所以导致这个错误。 解决方法如下:

    2024年02月11日
    浏览(30)
  • postman测试接口出现404

    上传方法原代码地址 博主不懂一休的《JAVA文件上传和下载》 出现问题:用postman测试报404  查了很多资料,大多数情况都说问题是: 404找不到资源,无非就是接口路径,提交方式、参数类型、返回结果类型有问题。 而我这是返回类型的问题。接口写的是@Controller,方法上没

    2024年02月11日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包