当前位置: 首页 > news >正文

AQS的ReentrantLock源码

什么是AQS(全称AbstractQueuedSynchronizer)

代表:重入锁、独占锁/共享锁、公平锁/非公平锁

是JUC包中线程阻塞、阻塞队列、唤醒、尝试获取锁的一个框架

AbstractQueuedSynchronizer是全称,是一个模板模式,一些线程同步公共的抽象类,里面有同步线程的类公共行为,比如:阻塞队列、加锁

AQS主要思想

尝试获取锁,如果获取失败就加入阻塞队列,如果有条件就先加入条件队列(如:ReentrantLock的创建多个newCondition()),条件队列中线程达到某个条件就会加入到阻塞队列,阻塞队列中的线程一直尝试获取锁。

ReentrantLock lock = new ReentrantLock(); 其中有个参数是否为公平锁

加锁

1. 判断参数是否为true 如果为true那么参数Syn就是FairSync,如果为false或者空代表非公平锁 Syn就是NonfairSync

2. 使用lock.lock();

公平锁:直接加入等待队列

非公平锁:尝试获取锁,如果获取到了那么就改变锁状态为1代表已经有线程持有锁了并且将当前线程复制给exclusiveOwnerThread参数留作后面判断是否为当前线程,如果当前线程就可以冲入直接返回true拿到锁,如果获取锁失败了就加入等待队列,加入等待队列时还会再次获取一次锁,如果还是失败了就会彻底加入等待队列

3. 加入等待队列

加入阻塞队列时再次尝试获取锁

队列使用的是链表,将当前Node节点加入到链表后面,如果是第一次加入到链表中就会创建头节点,头节点代表的就是已经获取到锁的那个线程,Thread参数为null,当前线程的Node节点在这个节点的后面并且Thread为当前线程。

如果第一次加入阻塞队列,初始化队列,下边这个代码相当于是自旋锁循环设置头节点

设置当前ReentrantLock的wait状态为-1。

加入队列以后设置指定当前线程 阻塞使用 LockSupport.park(this);

当前线程调用interrupted();方法优雅停止线程。

加锁完毕

释放锁

如果当前操作的线程不是加锁的线程就会抛出 IllegalMonitorStateException异常;

尝试改变当前锁的状态为0,如果成功就将当前操作线程改为0并且状态改为0

修改waitStauts并且指定出队的线程唤醒。

老师图片

http://www.lryc.cn/news/415984.html

相关文章:

  • CSP-J 模拟题2
  • 途牛养车省养车平台源码 买卖新车租车二手车维修装潢共享O2O程序源码
  • 开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪
  • 【Material-UI】Button 组件中的基本按钮详解
  • 人工智能自动驾驶三维车道线检测—PersFormer模型代码详解
  • LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备成为可能(上篇)
  • sql注入部分总结和复现
  • 开源企业级后台管理的快速启动引擎:Ballcat
  • FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)
  • C语言 | Leetcode C语言题解之第319题灯泡开关
  • 【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新
  • 【Linux】—— Linux进程状态(R、S、D、T、Z、X)
  • 重生之我在NestJS中使用EventStream
  • 自动化工具Selenium IDE基本使用——脚本录制
  • 【第十一天】进程调度算法,进程间通信方式,进程同步和互斥
  • Python的lambda函数
  • java9-泛型
  • zotero安装与使用
  • Elasticsearch未授权访问漏洞
  • 【FPGA】module中CLOCK RESET iCall oDone的含义
  • OpenGL实现3D游戏编程【连载2】——了解并创建3D空间模型
  • Java-文件操作和IO
  • AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统
  • C语言菜鸟入门·数据结构·链表超详细解析
  • C# Unity 面向对象补全计划 七大原则 之 依赖倒置原则 (DIP)难度:☆☆ 总结:多抽象,多接口,少耦合
  • 大模型面试问题
  • keeplive配置详解与haproxy配置详解
  • vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍
  • window关闭端口占用
  • Java:类和对象