成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ZooKeeper 分布式鎖 Curator 源碼 之一:可重入鎖

大數據 分布式
一般工作中常用的分布式鎖,就是基于 Redis 和 ZooKeeper,前面已經介紹完了 Redisson 鎖相關的源碼,下面一起看看基于 ZooKeeper 的鎖。也就是 Curator 這個框架。

 前言

一般工作中常用的分布式鎖,就是基于 Redis 和 ZooKeeper,前面已經介紹完了 Redisson 鎖相關的源碼,下面一起看看基于 ZooKeeper 的鎖。也就是 Curator 這個框架。

Curator 的鎖也分為很多種,本文分析共享可重入鎖。

考慮到如果文章篇幅較長,不太適合閱讀,所以對文章做了適當的拆分。

1環境配置

本機三個節點

版本:3.7.0 系統:macOS 安裝方式:brew install zookeeper Curator Maven 依賴版本:5.1.0

  1. <dependency> 
  2.     <groupId>org.apache.curator</groupId> 
  3.     <artifactId>curator-recipes</artifactId> 
  4.     <version>5.1.0</version> 
  5. </dependency> 

 

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

本文轉載自微信公眾號「程序員小航」,可以通過以下二維碼關注。轉載本文請聯系程序員小航公眾號。

 

責任編輯:武曉燕 來源: 程序員小航
相關推薦

2021-07-10 10:02:30

ZooKeeperCurator并發

2021-06-27 21:24:55

RedissonJava數據

2021-07-09 06:48:31

ZooKeeperCurator源碼

2021-07-16 07:57:34

ZooKeeperCurator源碼

2020-06-15 08:15:47

分布式鎖系統

2022-01-14 08:35:58

Curator分布式鎖Zookeeper

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2017-10-24 11:28:23

Zookeeper分布式鎖架構

2025-04-23 08:50:00

SpringBootCurator分布式鎖

2021-07-06 08:37:29

Redisson分布式

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2021-02-28 07:49:28

Zookeeper分布式

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2024-01-30 08:41:33

線程執行Redis分布式鎖

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2022-10-27 10:44:14

分布式Zookeeper

2021-07-01 09:42:08

Redisson分布式

2022-07-25 06:44:19

ZooKeeper分布式鎖

2018-11-27 16:17:13

分布式Tomcat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99视频免费看 | 伊人狠狠干 | 欧美国产日韩精品 | 99精品99| 国产乱码精品1区2区3区 | 欧美一级欧美三级在线观看 | 亚洲综合大片69999 | 欧美精品一区三区 | 可以免费看的毛片 | 91福利在线观看视频 | www.黄网 | 日韩久久网| 国产精品视频一 | 久久久精品视频免费 | 国产精品一区二区免费看 | 一区二区在线观看av | 国产成人免费视频 | 一道本不卡 | 国产福利视频在线观看 | 久久高清免费视频 | 日韩中文字幕2019 | 国产视频一二三区 | 久久成人一区 | 欧美在线一区二区三区 | 夜久久| 91成人精品 | 天天摸天天干 | 黄色三级免费 | 国产精品成人一区 | 国产成人精品久久二区二区91 | 精品1区2区3区 | 中文字幕在线观看精品 | 亚洲一区二区中文字幕在线观看 | 日韩午夜网站 | 国产一二三区在线 | 欧美日韩亚洲一区二区 | 爱爱无遮挡 | 日韩久久久久久 | 亚洲激情在线观看 | 中文字幕在线播放第一页 | 日产精品久久久一区二区福利 |