回复
Zookeeper分布式锁实现Curator十一问(三)
pivoteic
发布于 2022-6-15 17:07
浏览
0收藏
LockData主要封装了当前线程、加锁的次数、加锁的节点。
此时如果第二次来加锁,那么就会从threadData中获取到加锁的信息,然后将加锁次数加1,就代表了加锁成功,然后直接返回。
所以可重入加锁的实现很简单,就是在客户端中判断有没有加过锁,加过的话就将加锁次数累加1,压根就跟服务端没有交互。
注意Redisson可重入加锁的实现跟的Curator是不一样的,Redisson的加锁次数是存在Redis的服务端的,而Curator是存在客户端的。
五、加锁失败之后如何实现阻塞等待加锁
前面加锁的逻辑主要是说了加锁成功的情况,这里就来说一下加锁失败的情况。
继续来看internalLockLoop方法。
前面说过,判断有没有加锁成功,会返回一个PredicateResults,这里面包含了有没有加锁成功的信息,同时如果没有加锁成功,就会返回需要监听的节点,也就是当前创建的节点的前一个节点。
所以没有加锁成功,就会走else的逻辑,对上一个节点加一个监听器 watcher
然后就会调用 wait 方法,进行等待。
文章转自公众号:三友的java日记
标签
已于2022-6-15 17:07:05修改
赞
收藏
回复
相关推荐