ReenTranReadWriteLock 读写锁 笔记

2023-10-30

参考博客链接:
1.https://blog.csdn.net/qq_19431333/article/details/70568478
2.https://blog.csdn.net/yanyan19880509/article/details/52435135

背景知识

继承AQS的类都需要使用state变量代表某种资源,ReentrantReadWriteLock中的state代表了读锁的数量和写锁的持有与否,整个结构如下:
可以看到state的高16位代表读锁的个数;低16位代表写锁的状态。
这里写图片描述

1.读锁的获取

public void lock() {
sync.acquireShared(1);
}
acquireShared()共享锁的实现:
1.如果当前有写线程并且本线程不是写线程,那么失败,返回-1
2. 否则,说明当前没有写线程或者本线程就是写线程(可重入),接下来判断是否应该读线程阻塞并且读锁的个数是否小于最小值,并且CAS成功使读锁+1,成功,(1.也就是说如果当前的写锁是当前线程,那么当前写锁可以再次获取读锁 或者 2.当前的是读锁状态,是当前线程的话那么读锁重入,3.不是当前线程,那么只要该获取读锁的线程的队列前没有写锁,那么该线程就可以获取读锁)返回1。其余的操作主要是用于计数的
3. 如果2中失败了,失败的原因有三,第一是应该读线程应该阻塞;第二是因为读锁达到了上线;第三是因为CAS失败,有其他线程在并发更新state,那么会调动fullTryAcquireShared方法。

2.写锁的获取(写锁可重入)

1,如果当前有写锁或者读锁。如果只有读锁,返回false,因为这时如果可以写,那么读线程得到的数据就有可能错误;如果有写锁,但是线程不同,即不符合写锁重入规则,返回false
2. 如果写锁的数量将会超过最大值65535,抛出异常;否则,写锁重入
3. 如果没有读锁或写锁的话,如果需要阻塞或者CAS失败,返回false;否则将当前线程置为获得写锁的线程(CAS成功才可以获取到写锁)

3.释放锁

  • 如果当前是写锁被占有了,只有当写锁的数据降为0时才认为释放成功;否则失败。因为只要有写锁,那么除了占有写锁的那个线程,其他线程即不可以获得读锁,也不能获得写锁
  • 如果当前是读锁被占有了,那么只有在写锁的个数为0时才认为释放成功。因为一旦有写锁,别的任何线程都不应该再获得读锁了,除了获得写锁的那个线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReenTranReadWriteLock 读写锁 笔记 的相关文章

随机推荐

  • C++复习笔记--STL的基本概念和使用

    目录 1 STL基本概念 2 STL六大组件 2 1 容器的基本概念 2 2 算法的基本概念 2 3 迭代器的基本概念 3 代码实例 3 1 vector容器的使用 3 2 使用vector容器存储自定义类型 3 3 容器嵌套容器 1 ST
  • Angular4--【数据绑定】

    数据绑定 事件绑定 属性绑定 很多人对于DOM属性还是HTML属性易混 那我们首先来区分一下HTML和DOM 少量的HTML和DOM属性之前存在着1 1的映射 比如id 有些HTML属性没有对应的DOM属性 有些DOM属性没有对应的HTML
  • 10年测试专家深度解读接口测试

    01 对于接口测试来说 项目测试用例的重复运行首先是表现在单个测试用例的独立性方面的 也就是说 每一个测试用例的运行除了依赖被测对象和对应的数据库环境外 是不依赖于其他任何测试用例的 并且这个测试用例执行完毕后 对系统来说 也是没有任何痕迹
  • Linux查看端口占用情况的几种方式

    Linux查看端口占用情况的几种方式 概述 测试环境为Centos7 9 本文简单给出了几种检测端口的例子 一 查看本机端口占用 1 netstat 安装netstat yum y install net tools 检测端口占用 nets
  • /proc/sys/kernel/printk 打印log设置

    proc sys kernel printk Printk 共有4个参数 Cat proc sys kernel printk 7 4 1 7 1 第一个参数 7表示小于7优先级消息才会被输出到控制台 2 第二个参数4 表示默认的print
  • JAVA--Object(对象序列化)

    一 定义 把一个Object对象直接转化为字节流 让后把字节流直接写入本地硬盘或者网络中 如果需要对某个对象实现序列化 必须实现Serializable接口 Serialzable为空接口 起标识作用 transient修饰的成员无法被序列
  • 用Eclipse插件Git,让Repository回滚到之前的版本

    软件 1 Eclipse Neon 3 Release 4 6 3 2 Git Eclipse自带Git插件 Git远程仓库回滚的方法有两种 一 只回滚提交的代码 步骤如下 1 获取代码到最新版本 2 项目 鼠标右键 team show i
  • 什么是内存屏障?为什么需要内存屏障?

    1 什么是内存屏障 为什么需要内存屏障 首先 为了性能编译器和处理器都会对指令进行重排序 什么是内存屏障 内存屏障是一条指令 该指令可以对编译器 软件 和处理器 硬件 的指令重排做出一定的限制 比如 一条内存屏障指令可以禁止编译器和处理器将
  • Flutter 跨平台编程

    特点 Flutter 是一个令人兴奋的新软件开发工具包 可让您同时面向多个平台 因此您可以从一个代码库构建适用于 iOS Android 甚至 Web 和桌面的应用程序 与现代 Web 技术类似 Flutter 使用声明式方法进行 UI 开
  • C++数据封装 介绍和实现方法

    C 中的数据封装是一种OOP概念 它允许开发人员将数据和操作数据的函数组合在一起 并对外部隐藏数据细节 这样可以使代码更加安全 因为外部用户无法直接访问类的私有数据成员 以下是在C 中实现数据封装的一些步骤 创建一个类 首先 创建一个类来表
  • vmare连接远程服务器的问题

    测试环境 两端都是VMware Workstation 12 Pro 1 需要共享虚拟机 在虚拟机上点击右键 gt Manage gt Share 后面按照操作设置 2 远程服务器的443是用来做登录认证的 需要对外开放 如果远程服务器在内
  • mysql学习 day05

    今天 先继续完成了对约束的学习 约束 列级约束 表级约束 语法 create table 表名 字段名 字段类型 列级约束 字段名 字段类型 列级约束 表级约束 注意 列级约束和表级约束的区别 位置 支持 列级约束 列的后面 除了外键 表级
  • 盲盒商城源码,潮乎盲盒小程序,猜客魔盒/叮当魔盒/王大盒前端uni后端Laravel,全开源源码

    产品技术栈以及环境配置 服务器环境 linux 宝塔 建议最小配置 2h 4G 5M 后台开发语言 后端Laravel框架开发 反向代理服务器 nginx 前端开发框架 uniapp vue 支持四端同步数据 数据库 mysql 5 6 需
  • 计算一个字符串中包含另一个字符串的个数

    strong 有时候我们需要在一个长字符串中匹配我们需要的字符 这里我就写了一个方法 用来统计 我们要匹配的字符在长字符串中出现的次数 strong 计算一个字符串中包含另一个字符串的个数 param param str1 param pa
  • 基于WiFi的宿舍智能安防系统

    word完整版可点击如下下载 gt gt gt gt gt gt gt gt 基于WiFi的宿舍智能安防系统 rar 自然语言处理文档类资源 CSDN下载1 资源内容 毕业设计lun wenword版10000字 开题报告 任务书2 学习目
  • Building and Installing ACE and Its Auxiliary Libraries and Services

    Synopsis The file explains how to build and install ACE its Network Services test suite and examples on the various OS p
  • Python多线程同时处理多个文件

    前言 在需要对大量文件进行相同的操作时 逐个遍历是非常耗费时间的 这时 我们可以借助于Python的多线程操作来大大提高处理效率 减少处理时间 问题背景 比如说 我们现在需要从一个文件夹下面读取出所有的视频 然后对每个视频进行逐帧处理 由于
  • Geogebra求一道极难的几何题

    第2小题 答案是45 Geogebra文件下载 链接 https caiyun 139 com m i 0E5CKWJDt7wMr 提取码 WSev
  • C++面向对象之对象的初始化和清理

    对象的初始化和清理 生活中我们买的电子产品都会有基本的出厂设置 在某一天我们不用的时候会删除一些自己信息数据保证安全 C 中的面向对象来源于生活 每个对象也都会有初始设置以及对象销毁前的清理数据的设置 构造函数和析构函数 对象的初始化和清理
  • ReenTranReadWriteLock 读写锁 笔记

    参考博客链接 1 https blog csdn net qq 19431333 article details 70568478 2 https blog csdn net yanyan19880509 article details 5