推广 热搜: 京东  联通  iphone11  摄像头  企业存储  XSKY  京东智能采购  iPhone  网络安全  自动驾驶 

ZooKeeper 分布式锁 Curator 源码 之一:可重入锁

   日期:2021-07-09     来源:51cto    作者:itcg    浏览:392    我要评论    

政府采购 前言

一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。

政府采购

Curator 的锁也分为很多种,本文分析共享可重入锁。

考虑到如果文章篇幅较长,不太适合阅读,所以对文章做了适当的拆分。

1环境配置

政府采购

本机三个节点

版本:3.7.0 系统:macOS 安装方式:brew install zookeeper Curator Maven 依赖版本:5.1.0

     org.apache.curator     curator-recipes     5.1.0   2加锁示例

政府采购

详细信息可参考官方文档[1]。

加锁前

政府采购

在加锁之前,ZooKeeper 仅有一个节点 /zookeeper。

加锁中

在 /locks/lock_01 路径上加锁。

政府采购

加锁之后:

创建了一个 /locks/lock_01 的持久节点,节点下有一个子节点 _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是临时节点 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 的数据是机器 IP 地址 3加锁源码

PS:下面代码截图中的代码风格就是 Curator 源码的代码风格。

入口

InterProcessMutex#internalLock

政府采购

开始先从 threadData 中获取当前线程,这里肯定是没有的,所以进入 attemptLock 方法。

本方法中还包含了锁重入的逻辑,后面也会介绍。

加锁

LockInternals#attemptLock

政府采购

核心部分就是这两行:

createsTheLock 创建临时顺序节点 internalLockLoop 判断是否创建成功

创建临时顺序节点

StandardLockInternalsDriver#createsTheLock

政府采购

可以看出节点的 mode 是 CreateMode.EPHEMERAL_SEQUENTIAL,表示这是一个临时顺序节点!

进入 CreateBuilderImpl#forPath(java.lang.String, byte[])

政府采购

client.getDefaultData() 就是本机 IP 地址。

这个 adjustPath 方法看名字就是在调整路径之类的。会生成一个 UUID 拼接到 /locks/lock_01 中,变成 /locks/lock_01/_c_UUID-lock-。

因为创建的是临时顺序节点,所以会自动在后面添加顺序,最终变为 /locks/lock_01/_c_UUID-lock-0000000000。

具体创建节点是在 CreateBuilderImpl#pathInForeground 中。

政府采购

创建临时节点,如果路径存在,会创建成功,如果路径不存在会创建失败;

创建失败后,先创建路径,再创建节点。

4总结

本篇文章主要介绍了基于 ZooKeeper 的分布式锁框架 Curator 的使用,以及加锁流程,源码分析。

下面对内容做下总结:

政府采购

重点需要关注的是:

基于 ZooKeeper 的分布式锁,是使用的临时顺序节点,父节点是持久节点; 创建临时节点时,父节点不存在,会先创建父节点(路径); 锁的组成结构为:对 /locks/lock_01 加锁,实际锁住的是 /locks/lock_01/_c_UUID-lock-序号,举例为 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000

引用链接:

[1]ZooKeeper Shared Reentrant Lock: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
0相关评论

头条阅读
推荐图文
相关资讯
网站首页  |  物流配送  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅  |  违规举报  |  京ICP备14047533号-2
Processed in 0.175 second(s), 11 queries, Memory 1.49 M