可重入锁原理
2023-02-19 18:36:37 0 举报
zookeeper可重入锁原理
作者其他创作
大纲/内容
加锁次数是否为0
[_c_015549da-da52-4bd7-b828-c4bf41211ad6-lock-0000000000]
/locks/lock_01/_c_015549da-da52-4bd7-b828-c4bf41211ad6-lock-0000000000
获取自己的顺序节点的上一个节点
可重入加锁
位置是否是第一个
否
客户端B
[_c_015549da-da52-4bd7-b828-c4bf41211ad6-lock-0000000001]
释放锁底层逻辑
获取锁失败
从wait阻塞状态中苏醒过来
获取到分布式锁
zookeeper
将LockData中的加锁次数递减1
获取自己本次创建的顺序节点的名称
是
重新进入white(true)循环再次尝试获取锁
删除自己的顺序节点
获取本次创建的顺序节点名称在list中的位置:1
删除自己的LockData
客户端A
通知上个一顺序节点自己被删除了
_c_015549da-da52-4bd7-b828-c4bf41211ad6-lock-0000000000
获取本次创建的顺序节点名称在list中的位置:0
获取到/locks/lock_01目录下所有的子节点进行排序
本次创建的顺序节点的名称
Object.wait()当前线程进入无限制的阻塞和等待
将lockData中的加锁次数累加1就可以了AtomicInteger
获取到/locks/lock_01目录下所有的子节点
LockData是否存在
直接返回
_c_015549da-da52-4bd7-b828-c4bf41211ad6-lock-0000000001
[font color=\"#f44336\" style=\"\
Object.notifyAll()唤醒当前机器上所有的wait线程
释放锁
重新尝试加锁逻辑
将所有的子节点按照节点名称从小到大排序
自己的节点是否为第一个
0 条评论
回复 删除
下一页