当前位置:网站首页>AQS & ReentrantLock 实现原理
AQS & ReentrantLock 实现原理
2022-04-23 07:18:00 【MARIO ODYSSEY】
1 AQS (AbstractQuenedSynchronizer)
- AQS 维护状态
volatile int state
(ReentrantLock
将它作为锁的重入次数)和一个 FIFO 的线程等待队列,多线程争用资源被阻塞的时候就会进入这个队列;队列头部的线程执行完毕之后,它会调用它的后继的线程 - 线程通过 CAS 改变状态符 state,成功则获取锁成功,失败则进入等待队列,等待被唤醒
- AQS 采用 自旋锁 的机制
2 ReentrantLock 非公平锁加锁流程
- 非公平锁是指新来的线程跟 AQS 队列头部的线程竞争锁,队列其他的线程还是正常排队
- 公平锁严格执行 FIFO,新线程只能加入队尾
- 非公平锁尝试加锁,即执行
tryAcquire()
的流程是:检查state字段,若为0,表示锁未被占用,尝试占用锁;若不为0,检查当前锁是否被自己占用,若被自己占用,则更新 state 字段,重入次数加 1 - 如果以上两点都没有成功,则获取锁失败,进入等待队列
- 进入等待队列的线程尝试获取锁(最靠前的线程才有资格尝试),如果获取成功则成为队列新的头节点,获取失败则尝试挂起
- 线程入队后能够挂起的前提是,它的前驱节点的状态为 SIGNAL,状态为 SIGNAL 的节点在出队后会唤醒后面紧邻的节点
3 ReentrantLock 和 synchronized 的异同
- 响应中断:如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。Lock 等待锁过程中可以用interrupt 来中断等待
- 超时等待:规定超时等待时间,避免线程无限期的等待锁释放
- 公平锁与非公平锁:公平锁是指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则允许线程“插队”,具体是新来的线程和队首的线程竞争锁
版权声明
本文为[MARIO ODYSSEY]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785688/article/details/124347944
边栏推荐
- Asynchronous learning
- Compiling principle questions - with answers
- Mobile web (Font Icon, plane conversion, color gradient)
- Listed on the Shenzhen Stock Exchange: the market value is 5.2 billion yuan. Lu is the East and his daughter is American
- 简述存储器的分级策略
- The whole house intelligence bet by the giant is driving the "self revolution" of Hisense, Huawei and Xiaomi
- js常用数组方法
- nn.Module类的讲解
- DataBinding的使用五
- 青苹果影视系统源码 影视聚合 影视导航 影视点播网站源码
猜你喜欢
1216_MISRA_C规范学习笔记_控制流的规则要求
【学习】从零开始的音视频开发(9)——NuPlayer
WordPress爱导航主题 1.1.3 简约大气网站导航源码网址导航源码
CSV column extract column extraction
【Appium】测试时遇到手机内嵌H5页面的切换问题
为什么会存在1px问题?怎么解决?
几种智能机器人室内定位方法对比
校园转转二手市场源码下载
[appium] encountered the problem of switching the H5 page embedded in the mobile phone during the test
PyQt5开发之QTableWidget表头自定义与美化(附源代码下载)
随机推荐
LeetCoed18. Sum of four numbers
Find the largest of 3 strings (no more than 20 characters per string).
NFT ecological development of Ignis public chain: unicorn Donation and development of Art
JS converts tree structure data into one-dimensional array data
396. Rotate Function
高精度焊接机械臂定位
AAAI 2022招募讲者啦!!
刨析——浏览器如何工作
Face to face summary 2
dmp引擎工作总结(2021,光剑)
单点登录 SSO
Solidity IDE Remix中文版使用手册
Convert object to URL
室内定位技术对比
Planification du mouvement du manipulateur dans l'assemblage 3c
The third divisor of leetcode simple question
Transformer-XL: Attentive Language ModelsBeyond a Fixed-Length Context 论文总结
岛屿的个数
通过实现参数解析器HandlerMethodArgumentResolver接口来自定义注解
【学习】从零开始的音视频开发(9)——NuPlayer