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

ops/2024/10/21 1:57:15/

文章目录

  • 读写锁互斥:基于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. 优化写操作
      • 总结

AQSstate16_1">读写锁互斥:基于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.ppmy.cn/ops/55835.html

相关文章

elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理

click快速点击&#xff0c;发生多次触发 2.代码示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…

2^k进制数(对每部分代码详解)

2^k进制数 题目描述 设 r r r 是个 2 k 2^k 2k 进制数&#xff0c;并满足以下条件&#xff1a; r r r 至少是个 2 2 2 位的 2 k 2^k 2k 进制数。 作为 2 k 2^k 2k 进制数&#xff0c;除最后一位外&#xff0c; r r r 的每一位严格小于它右边相邻的那一位。 将 r r r …

PIL,OpenCV,Pytorch处理图像时的通道顺序(颜色,长宽深)

项目颜色通道顺序长宽通道顺序数据类型取值范围PILRGBHWCndarray0-255 (byte)OpenCVBGRHWCndarray0-255 (byte)PyTorchRGB/BGR (取决于如何读取)(N)CHWtensor0-1 (float, 标准化后); 0-255 (int, 未标准化) 注意以下几点&#xff1a; 颜色通道顺序&#xff1a;PIL默认使用RGB顺…

SQLite 附加数据库

SQLite 附加数据库 SQLite 是一种轻量级的数据库管理系统,因其小巧、快速和易于使用而广受欢迎。在 SQLite 中,可以将多个数据库文件附加到单个数据库连接中,从而允许用户在不同的数据库之间轻松切换和操作数据。本文将详细介绍如何在 SQLite 中附加数据库,并探讨其使用场…

网页封装APP:让您的网站变身移动应用

网页封装APP&#xff1a;让您的网站变身移动应用 随着移动设备的普及&#xff0c;越来越多的人开始使用移动设备浏览网站。但是&#xff0c;传统的网站设计并不适合移动设备的屏幕尺寸和交互方式&#xff0c;这导致了用户体验不佳和流失。 有没有办法让您的网站变身移动应用&…

qt 如果把像素点数据变成一个图片

1.概要 图像的本质是什么&#xff0c;就是一个个的像素点&#xff0c;对与显示器来说就是一个二维数组。无论多复杂的图片&#xff0c;对于显示器来说就是一个二维数组。 2.代码 #include "widget.h"#include <QApplication> #include <QImage> #incl…

HNU电子测试平台与工具2_《计算机串口使用与测量》

&#xff08;这个有留word哈哈&#xff09; 4.1 4.2 Linux 操作系统平台 一、实验目的 了解 Linux 系统文件系统的基本组织了解 Linux 基本的多用户权限系统熟练使用 ls、cd、cat、more、sudo、gcc、vim 等基本命令会使用 ls 和 chmod 命令查看和修改文件权限 二、实…

html+css+js图片手动轮播

源代码在界面图片后面 轮播演示用的几张图片是Bing上的&#xff0c;直接用的几张图片的URL&#xff0c;谁加载可能需要等一下&#xff0c;现实中替换成自己的图片即可 关注一下点个赞吧&#x1f604; 谢谢大佬 界面图片 源代码 <!DOCTYPE html> <html lang&quo…