乐趣区

关于zookeeper:ZooKeeper-分布式锁-Curator-源码-01可重入锁

前言

个别工作中罕用的分布式锁,就是基于 Redis 和 ZooKeeper,后面曾经介绍完了 Redisson 锁相干的源码,上面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。

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

思考到如果文章篇幅较长,不太适宜浏览,所以对文章做了适当的拆分。

环境配置

本机三个节点

版本:3.7.0
零碎:macOS
装置形式:brew install zookeeper
Curator Maven 依赖版本:5.1.0

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.1.0</version>
</dependency>

加锁示例

详细信息可参考官网文档。

加锁前

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

加锁中

/locks/lock_01 门路上加锁。

加锁之后:

  1. 创立了一个 /locks/lock_01 的长久节点,节点下有一个子节点 _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000
  2. 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是长期节点
  3. 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 的数据是机器 IP 地址

加锁源码

PS:上面代码截图中的代码格调就是 Curator 源码的代码格调。

入口

InterProcessMutex#internalLock

开始先从 threadData 中获取以后线程,这里必定是没有的,所以进入 attemptLock 办法。

本办法中还蕴含了锁重入的逻辑,前面也会介绍。

加锁

LockInternals#attemptLock

外围局部就是这两行:

  1. createsTheLock 创立长期程序节点
  2. 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 中。

  1. 创立长期节点,如果门路存在,会创立胜利,如果门路不存在会创立失败;
  2. 创立失败后,先创立门路,再创立节点。

总结

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

上面对内容做下总结:

重点须要关注的是:

  1. 基于 ZooKeeper 的分布式锁,是应用的长期程序节点,父节点是长久节点;
  2. 创立长期节点时,父节点不存在,会先创立父节点(门路);
  3. 锁的组成构造为:对 /locks/lock_01 加锁,理论锁住的是 /locks/lock_01/_c_UUID-lock- 序号,举例为 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000

相干举荐

  • Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch
  • Redisson 分布式锁源码 10:读写锁
  • Redisson 分布式锁源码 09:RedLock 红锁的故事
退出移动版