您的当前位置:首页 > 热点 > ZooKeeper 分布式锁 Curator 源码之三:可重入锁并发加锁 正文
时间:2026-11-14 来源:网络整理 编辑:热点
谷歌快排【tg:seogoogle987】
前言
在了解了加锁和锁重入之后,最需要了解的还是在分布式场景下或者多线程并发加锁是如何处理的?
1并发加锁
先来看结果,在多线程对 /loZocks/lock_01 加锁时,是在后面又创建了新的临时节点。
这块在加锁方法 CreateBuilderImpl#pathInForegrooKund 中已经介绍过
这里判断 /locks/lock_01 路径已经存在,会直接创建新的临时顺序节点。
真正判断锁是否获取成功,其实是在 LoeeckInternals#attemptLock 方法中的 internalLockLoop 方法中。
加锁结果及监听
internalLockpeLoop 方法的主要作用是判断加锁结果,以及获取锁失败时,对其他节点的监听。
获取父节点 /locks/lock_01 下的所有子节点,按r 照从小到大排序,判断自己是不是获取到锁,没有获取到就监听自己前一个节点; 支持设置超时时间,超时直接返回失败; 不支持设置超时时间或者还分布没有超时,则直接 wait 等待。
是否获取锁的代码在 StandardLockInternalsDriver#getsTheLock
这块就是判断是式锁否为最小节点,因为在 getSortedChildren 中已经对所有节点排序,所以方法中的 List children 是有序的。
maxLe Cases 是在 InterProcessMutex 初始化的时候,指定的值为 1。
最终这里的结果是,判断自己是不是最小,不是最小,就将 pathurToWatch 设置为前一个节点。
只监听自己的前一个节点,可以避免羊群效应!
为什么要进行等待呢?
因为是为了防止无效自旋,因为这里有监听at机制,会监听上一个节点是否释放。
这块是 ZooKeeper 的 Watcher 监听机制,在节点释放的时候,会进行回调,然后使用 Java 的 noortifyAll 方法通知所有的 wait 线程。然后这里的 while trye 会继续执行,重新检查是否获得锁等。
2总结
本文主要介绍了基于 ZooKee 源per 的分布式锁框架 Curator 在并发场景下的锁竞争问题。
重点需要了解的是:
为了避免羊群效应,临时顺序节点,加锁失败后监听的是前码之一个节点; 为了避免无效自旋,这里使用了 Java 的 wait/notifyAll 机制; 可以看出,默认加锁就是公平锁。
阿里云CTO周靖人成为阿里合伙人2026-10-29
苹果官网“价格乌龙”事件发酵,有律师计划起诉维权2026-06-12
标签: 恋与深空 敖尹 祁煜 夏以昼2026-11-05
标签: 富瀚微 半导体 AI芯片 国产替代2026-06-24
标签: OpenClaw 腾讯云 腾讯AI 彼得·斯坦伯格2026-06-22
辞任亚马逊CEO 贝索斯“急流勇退”2026-07-26
标签: 东方甄选 明明 天权 俞老师2026-10-31
超5亿用户信息遭泄露 Facebook:不打算通知相关用户2026-06-07
一个可以进行机器学习特征选择的Python工具2026-06-30
Anthropic 计划全球扩张:国际员工将翻倍,聚焦人工智能市场2026-11-11
标签: 618大促 天猫618 京东618 抖音电商2026-08-08
彻底解决 Gcr、Quay、DockerHub 镜像下载难题!2026-08-28
速度提升2倍,超强悍CPU级骨干网络PP-LCNet出世2026-05-20
可视化神器Plotly玩转漏斗图2026-05-27
蚂蚁链发布BTN:可将区块链网络吞吐量提升186% 带宽成本降低80%2026-09-07
标签: 特朗普 AI监管 联邦框架2026-06-03