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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 