Java并发编程-AQS详解及案例实战(下篇)

文章目录

  • 读写锁互斥:基于AQS的state二进制高低16位完成互斥判断
      • `state`变量的位分配
      • 读写锁互斥判断
      • 代码实现
      • 总结
  • 释放写锁的源码剖析以及对AQS队列唤醒阻塞线程的过程
      • 释放写锁的源码
      • AQS的`release`方法
      • 唤醒等待线程
      • 总结
  • 基于CAS实现多线程并发同时只有一个可以加读锁
      • 使用CAS实现单读者锁
        • 加锁操作
        • 伪代码
      • 注意事项
      • 结论
  • 多线程加读锁时的重复循环自旋尝试完成加锁
      • 自旋加读锁的实现
      • 自旋锁的优缺点
      • 优化自旋锁
  • 再次回头看看读锁占用时加写锁失败如何入队阻塞等待
      • 读锁占用时加写锁失败的处理
      • 入队和阻塞等待
      • 阻塞等待期间
      • 唤醒阻塞线程
      • 总结
  • 读锁释放过程分析以及如何基于AQS唤醒阻塞加写锁的线程
      • 读锁释放过程
      • 基于AQS唤醒等待写锁的线程
      • 总结
  • 如何用Condition实现wait和notify的效果
      • 创建Condition对象
      • 使用Condition实现wait和notify
        • 1. 使用`await`代替`wait`
        • 2. 使用`signal`代替`notify`
        • 3. 使用`signalAll`代替`notifyAll`
      • 总结
  • 基于AQS实现的Condition阻塞过程源码分析
      • AQS中的Condition实现
      • Condition阻塞过程分析
        • 1. 调用`await`方法
        • 2. 添加等待节点
        • 3. 释放锁
        • 4. 等待状态
        • 5. 唤醒和重新获取锁
      • 总结
  • 基于AQS实现的Condition唤醒阻塞线程的源码分析
      • 唤醒流程概览
      • 1. `signal`方法分析
      • 2. `signalAll`方法分析
      • 3. `transferForSignal`方法
      • 总结
  • AQS案例实战:服务注册表的多线程并发读写场景分析
      • 场景描述
      • 解决方案
      • 实现细节
        • 1. 定义读写锁
        • 2. 读操作
        • 3. 写操作
      • 总结
  • AQS案例实战:基于读写锁优化服务注册表的读写加锁操作
      • 设计思路
      • 实现方案
        • 1. 引入读写锁
        • 2. 优化读操作
        • 3. 优化写操作
      • 总结

读写锁互斥:基于AQS的state二进制高低16位完成互斥判断

ReentrantReadWriteLock中,读写锁的互斥性是通过AQS(AbstractQueuedSynchronizer)的state变量的不同位来实现的。state变量是一个32位的整数,被分为两部分,高位用于表示写锁的状态,而低位用于表示读锁的状态。这种设计允许读写锁在读操作和写操作之间实现互斥,同时允许多个读操作并行执行。

state变量的位分配

具体来说,state变量的高位(例如,第16位到第31位)表示写锁的状态。如果这些位的值不为0,表示有线程持有写锁。低位(第0位到第15位)表示读锁的计数,每有一位线程获取读锁,低位的值就增加1。

读写锁互斥判断

在尝试获取读锁或写锁时,ReentrantReadWriteLock会检查state变量的相应位,以判断是否可以获取锁:

  1. 读锁获取:当尝试获取读锁时,会检查state变量的高位是否为0,即没有写锁被持有。如果高位为0,表示没有写锁被持有,可以安全地获取读锁,同时增加低位的读锁计数。

  2. 写锁获取:当尝试获取写锁时,会检查state变量的高位是否为0&#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/780315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rsyslog日志转发

前言 Rsyslog可用于接受来自各种来源(本地和网络)的输入,转换它们,并将结果输出到不同(通过模板和filter过滤)的目的地(目录文件中) rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP…

树莓派5安装冬瓜HAOS教程

原文来自瀚思彼岸和hasshome 一、安装前准备 (1)软件 1、树莓派烧录软件Imager 2、冬瓜HAOS镜像 (2)硬件 1、树莓派5 2、TF卡(SanDisk Extreme PRO 64GB U3 A2 V30 4k) 3、读卡器 4、键盘和鼠标 5、显…

550kg级大载重长航时无人机直升机技术详解

550kg级大载重长航时无人机直升机,作为一种高性能的无人机系统,具备了多项先进的技术特点,以满足高海拔、高寒等复杂环境下的应用需求。这些无人机直升机通常具备高载重、长航时、强适应性、高可靠性和良好的任务拓展性。 设备由无人直升机平…

ctfshow-web入门-文件上传(web151-web160)

目录 1、web151 2、web152 3、web153 4、web154 5、web155 6、web156 7、web157 8、web158 9、web159 10、web160 1、web151 试了下前端只能传 png 后缀的 将一句话木马改成 png 后缀,上传后用 burpsuite 抓包 绕过前端检测后,改回 php 后缀&am…

(南京观海微电子)——MOS管原理及应用区别

MOS管: 全称为金属氧化物半导体场效应管(Metal Oxide Semiconductor Field Effect Transistor),也被称为MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor)。它是一种半导体器件,常用…

[数据结构] 基于选择的排序 选择排序堆排序

标题:[数据结构] 基于选择的排序 选择排序&&堆排序 水墨不写bug (图片来源于网络) 目录 (一)选择排序 实现:(默认从小到大排序) 优化后实现方法: (二)堆排序…

latex英文转中文word,及一些latex相关工具分享

前言:想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译:直接使用谷歌翻译等辅助将英文翻译成中文即可; 2、图片: 使用latex时一般保存的.png,.bmp格式图片可以直接插入word, 但是.eps或者 .p…

基于Android Studio零食工坊

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 可以浏览商品 , 查询商品 , 加入购物车 , 结算商品 , 查看浏览记录 , 修改密码 , 修改个人信息 , 查询订单 管理员 能够实现商品的…

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…

分布式整合

一、分布式架构介绍 什么是分布式系统 分布式系统指一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 通俗的理解,分布式系统就是一个业务拆分成多个子业务,分布在不同的服务器节点&#xff0…

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装(以window 64位为例)1.3、配置环境变量(非必须) 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书,并且自签名 2.3、服务端证书生成2…

JDBC的基本认识

前提 在了解和学习JDBC之前,大家 已经学习过 java语言 和数据库的基本知识了,今天这篇博客的核心,就是告诉大家 ,jdbc 是连接java编译器和数据库,是使用java对数据库进行操作的。 正文 JDBC简介 概念 JDBC的本质 1…

解决微信读书和Apple Books导入epub电子书不显示图片的问题

title: 解决微信读书和Apple Books导入epub电子书不显示图片的问题 tags: 个人成长 categories:杂谈 最近找到一本很喜欢的书的电子版的epub版,发现无论是导入微信读书,还是Apple家的Books, 都无法正常显示图片。 于是我用calibre打开epub电子书&#x…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务,是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型,实现如下的效果: 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…

nacos-sdk-python——Python版本Nacos客户端

Nacos(Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它主要用于解决微服务架构中服务发现和配置管理的问题,提供了一站式解决方案。以下是 Nacos 的几个关键功能: 服务发现和健康…

C++模板元编程(一)——可变参数模板

这个系列主要记录C模板元编程的常用语法 文章目录 引言语法应用函数模板可变参数的打印可变参数的最小/最大函数 类模板 参考文献 引言 在C11之前,函数模板和类模板只支持含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含任意个(包括0个)…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么?☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

Linux中的管道符‘|‘以及SQL(DQL,DCL)

ls 指令 语法: ls [选项][目录或文件] 功能: 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -…

【初阶数据结构】深入解析循环队列:探索底层逻辑

🔥引言 本篇将介绍如何实现循环队列并实现过程需要注意的事项,虽然篇幅较小,但是其中逻辑还是值得引人思考的,循环队列可以采用数组或链表实现,这篇将采用数组实现循环队列 🌈个人主页:是店小二…

Webpack: Loader开发 (1)

概述 如何扩展 Webpack?有两种主流方式,一是 Loader —— 主要负责将资源内容翻译成 Webpack 能够理解、处理的 JavaScript 代码;二是 Plugin —— 深度介入 Webpack 构建过程,重塑 构建逻辑。 相对而言,Loader 的职责…