Zookeeper分布式锁实现Curator十一问(三)

pivoteic
发布于 2022-6-15 17:07
浏览
0收藏

 

LockData主要封装了当前线程、加锁的次数、加锁的节点。

 

此时如果第二次来加锁,那么就会从threadData中获取到加锁的信息,然后将加锁次数加1,就代表了加锁成功,然后直接返回。

Zookeeper分布式锁实现Curator十一问(三)-鸿蒙开发者社区

所以可重入加锁的实现很简单,就是在客户端中判断有没有加过锁,加过的话就将加锁次数累加1,压根就跟服务端没有交互。

 

注意Redisson可重入加锁的实现跟的Curator是不一样的,Redisson的加锁次数是存在Redis的服务端的,而Curator是存在客户端的。

Zookeeper分布式锁实现Curator十一问(三)-鸿蒙开发者社区

五、加锁失败之后如何实现阻塞等待加锁

 

前面加锁的逻辑主要是说了加锁成功的情况,这里就来说一下加锁失败的情况。

 

继续来看internalLockLoop方法。

Zookeeper分布式锁实现Curator十一问(三)-鸿蒙开发者社区

前面说过,判断有没有加锁成功,会返回一个PredicateResults,这里面包含了有没有加锁成功的信息,同时如果没有加锁成功,就会返回需要监听的节点,也就是当前创建的节点的前一个节点。

 

所以没有加锁成功,就会走else的逻辑,对上一个节点加一个监听器 watcher

Zookeeper分布式锁实现Curator十一问(三)-鸿蒙开发者社区然后就会调用 wait 方法,进行等待。

Zookeeper分布式锁实现Curator十一问(三)-鸿蒙开发者社区

文章转自公众号:三友的java日记

标签
已于2022-6-15 17:07:05修改
收藏
回复
举报
回复
    相关推荐