ReetrantLock 源码解析(UML图版)

废话不说,上图:
ReetrantLock 源码解析
PS:绘图工具用的是idea插件: PlantUML integration(idea插件网上五星好评的那个.)本来想用泳道图的,但用starUML不好上手,这个插件有官方教程,语法一看就懂容易上手:

https://plantuml.com/zh/sequence-diagram

idea插件安装使用请自行搜索.
图中如有错误或不详细的地方,欢迎评论区探讨.
附赠UML代码:


@startuml

title ReetrantLock 源码解析

'消息自增时序
'autonumber

'设置泳道别名,顺序
'participant 真名 as 别名 order 顺序  顺序数越小越在左边.
participant ReetrantLock as ReetrantLock order 10
participant sync as sync order 20
participant NonfairSync as NonfairSync order 30
participant FairSync as FairSync order 40
participant AQS as AQS order 50

ref over ReetrantLock
获取一个资源的锁时,每个资源有个等待队列.
每个线程想要获得这个资源的锁时如果按照先来后到的顺序进入等待队列,那么这把锁就是公平锁.
如果线程刚来,即使等待队列里有线程在等待,刚来的线程也参与竞争抢锁,那么这把锁就是非公平锁.

ReetrantLock 默认非公平锁
end ref

note over NonfairSync: NonfairSync extends Sync, 非公平
note over ReetrantLock: 非公平锁
ReetrantLock -> sync: 1 ReetrantLock.lock() 直调 sync.lock()
sync -> NonfairSync: 2 sync.lock() 直调 NonfairSync.lock()
note right of sync
在NonfairSync.lock()里尝试用CAS设置state值由0改1.成功就设置线程为当前独有.
如果设置state值失败,说明没有抢到这把锁.那么这个线程就去等待队列里等待,像公平锁一样.
end note
'|||相当于换行符
|||
==  ==
|||

note over of AQS
有个 volatile state属性 值由实现类来定.
在ReetrantLock里
state为1: 当前线程得到了这把锁.(加锁)    state为0: 当前线程释放了这把锁.(解锁)
在AQS里state有个队列.每个节点都是一个Node对象.node类似于双向链表的结构.每个node里装的是一个个的线程
end note

note over ReetrantLock: 公平锁(需创建ReetrantLock时指定)
ReetrantLock -> sync: 1 ReetrantLock.lock() 直调 sync.lock()

sync -> FairSync: 2 sync.lock() 直调 FairSync.lock()
FairSync -> AQS: 3 FairSync.lock() -> AQS.acquire()

note left of AQS
AQS.acquire()方法
调ReetrantLock.tryAcquire()抢锁
先获得锁状态,状态如果是0(没有线程占用),用CAS方式设置当前线程独有这把锁(可重入).
如果没抢到,就去等待队列里等着.
end note

AQS -> ReetrantLock: 4 AQS.acquire() -> ReetrantLock.tryAcquire()
note right of ReetrantLock
ReetrantLock.nonfairTryAcquire()方法:
先获得锁状态,状态如果是0(没有线程占用),用CAS方式设置当前线程独有这把锁(可重入).
end note
ReetrantLock -> ReetrantLock: 5 ReetrantLock.tryAcquire() -> ReetrantLock.nonfairTryAcquire()

@enduml


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值