当前位置:网站首页>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 竞争失败
边栏推荐
- API for JD.com to obtain historical price information of commodities
- rj45对接头千兆(百兆以太网接口定义)
- Basic configuration of OSPFv3
- Go basic part study notes
- Istio介绍
- 杰理语音芯片ic玩具芯片ic的介绍_AD14NAD15N全系列开发
- Huawei mobile phone one-click to open "maintenance mode" to hide all data and make mobile phone privacy more secure
- 【愚公系列】2022年07月 Go教学课程 023-Go容器之列表
- 【AcWing】The 62nd Weekly Match 【2022.07.30】
- Bika LIMS 开源LIMS集—— SENAITE的使用(检测流程)
猜你喜欢
2022 Android interview summary (with interview questions | source code | interview materials)
请问我的这段sql中sql语法哪里出了错
Arduino框架下STM32全系列开发固件安装指南
go mode tidy出现报错go warning “all“ matched no packages
All-platform GPU general AI video supplementary frame super-score tutorial
GateWay实现负载均衡
手把手教你学会部署Nestjs项目
TestCafe总结
go基础部分学习笔记记录
flyway的快速入门教程
随机推荐
leetcode 665. Non-decreasing Array 非递减数列(中等)
京东按关键字搜索商品 API
【AcWing】第 62 场周赛 【2022.07.30】
架构师04-应用服务间加密设计和实践
【码蹄集新手村600题】通向公式与程序相结合
Unity 之 音频类型和编码格式介绍
leetcode: 6135. The longest ring in the graph [inward base ring tree + longest ring board + timestamp]
INeuOS industrial Internet operating system, the equipment operational business and "low code" form development tools
matplotlib ax bar color 设置ax bar的颜色、 透明度、label legend
每日练习------随机产生一个1-100之间的整数,看能几次猜中。要求:猜的次数不能超过7次,每次猜完之后都要提示“大了”或者“小了”。
华为手机一键开启“维修模式”隐藏所有数据,让手机隐私更加安全
常用的安全渗透测试工具(渗透测试工具)
35道MySQL面试必问题图解,这样也太好理解了吧
BOW/DOM(上)
淘宝/天猫获得淘口令真实url API
c语言解析json字符串(json对象转化为字符串)
Apache EventMesh distributed event-driven multi-runtime
Golang 切片删除指定元素的几种方法
C# 之 扑克游戏 -- 21点规则介绍和代码实现
mysql的备份表的几种方法