当前位置:网站首页>ReentrantLock原理(未完待续)
ReentrantLock原理(未完待续)
2022-07-31 19:21:00 【斯沃福德】
1. 概述
ReentrantLock底层基于AQS,其构造方法返回的就是NonfaireSync和faireSync;
两种同步器都继承自Sync,Sync又继承自AQS!
new ReentrantLock时,返回的就是同步器,默认是非公平的;
2. 非公平锁的加锁
2. 1 加锁成功
调用lock() 方法,使用CAS机制尝试将AQS底层 volatile修饰的 state 属性改为1,若成功即加锁;
若失败即出现竞争,则进入acquire() 方法;
2. 2 加锁失败
- 当锁已经被占用,共享内存中的 state属性是1,compareAndSet(0,1) 会失败,CAS更改state属性失败,会进入 acquire() 方法;
- 进入else中 AQS的 acquire() 方法;
- 调用 tryAcquire() 再次尝试,结果为false,取反就是true,再执行acquireQueued() ,会创造一个Node节点对象关联线程,放到FIFO等待队列(双向链表)中;
- 节点进入队列后,会循环尝试加锁,失败后会被park阻塞,节点的waitStatus 会被置为 -1,后续会由前序节点来唤醒这个节点;
AQS中的acquire()方法:
假设多个线程多竞争失败,进入了FIFO等待队列:
2. 非公平锁的释放
2.1 竞争成功
- 调用 unlock() 方法,底层调用了release() 方法,使用tryRelease() 将state置为0即释放锁;
- tryRelease() 返回true后,判断head哨兵节点是否为null ,如果否且哨兵节点的waitStatus 也不会0(为-1),则哨兵节点的后继节点被unParkSuccessor 唤醒 !然后这个后继节点会从FIFO队列中移除;
2.1 竞争失败
边栏推荐
- 每日练习------随机产生一个1-100之间的整数,看能几次猜中。要求:猜的次数不能超过7次,每次猜完之后都要提示“大了”或者“小了”。
- Verilog实现占空比为5/18的9分频
- -xms -xmx(information value)
- 【PIMF】OpenHarmony 啃论文俱乐部—盘点开源鸿蒙三方库【3】
- iNeuOS工业互联网操作系统,设备运维业务和“低代码”表单开发工具
- UserAgent 解析
- Basic configuration of OSPFv3
- Flink_CDC搭建及简单使用
- <artifactId>ojdbc8</artifactId>「建议收藏」
- Getting Started with Tkinter
猜你喜欢
使用 Flutter 和 Firebase 制作!计数器应用程序
【码蹄集新手村600题】通向公式与程序相结合
1161. 最大层内元素和 : 层序遍历运用题
OSPFv3的基本配置
35道MySQL面试必问题图解,这样也太好理解了吧
高通cDSP简单编程例子(实现查询高通cDSP使用率、签名),RK3588 npu使用率查询
Introduction of Jerry voice chip ic toy chip ic_AD14NAD15N full series development
MySQL---子查询
Made with Flutter and Firebase!counter application
AI 自动写代码插件 Copilot(副驾驶员)
随机推荐
flyway的快速入门教程
MySQL---sort and pagination
Write a database document management tool based on WPF repeating the wheel (1)
微信小程序的路由拦截
Kotlin协程:续体、续体拦截器、调度器
MySQL---排序与分页
ojdbc8 "Recommended Collection"性能优化:记一次树的搜索接口优化思路
How can we improve the real yourself, become an excellent architect?
Architect 04 - Application Service Encryption Design and Practice
35道MySQL面试必问题图解,这样也太好理解了吧
九齐ny3p系列语音芯片替代国产方案KT148A性价比更高420秒长度
C# 之 扑克游戏 -- 21点规则介绍和代码实现
The new telecom "routine", my dad was tricked!
Linux环境redis集群搭建「建议收藏」
ResNet的基础:残差块的原理
Arduino框架下STM32全系列开发固件安装指南
leetcode 665. Non-decreasing Array
Chinese encoding Settings and action methods return values
【码蹄集新手村600题】通向公式与程序相结合