Zookeeper 可重入锁的原理
2021-04-26 19:08:49 0 举报
Zookeeper 可重入锁的原理
作者其他创作
大纲/内容
客户端A
[/locks/lock-01/_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000000]
有
map中是否有LockData
加锁次数是否为0
对所有的子节点按从小到大顺序排序
本次顺序节点的名称
_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000001
_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000000
客户端B
位置是否是第一个节点
获取分布式锁成功,创建锁数据
本次节点名称在list中的位置
对上一个节点新增watcher监听器
移除map中的缓存数据
/locks/lock-01/_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000000
zookeeper
唤醒
是
在zk中将当前节点删除
获取/locks/lock_01下所有的子节点
通知上一个节点被删除了
释放锁
重新进入while循环,再次尝试获取锁
可重入加锁
将LockData中的加锁次数递减1
创建临时顺序节点
否
/locks/lock-01/_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000000/locks/lock-01/_c_0a6c7b1a-2403-4d97-9f9d-3ebe23bc0e56-lock-0000000001
将LockData中的加锁次数累加1AtomicInteger
执行notifyAll方法唤醒所有处于等待的线程
Object.wait()当前线程陷入等待
获取上一个节点的path
0 条评论
下一页