Curator实现分布式锁的基本原理-LockInternals.attemptLock
// 尝试获取锁,并返回锁对应的Zookeeper临时顺序节点的路径
String attemptLock(long time, TimeUnit unit, byte[] lockNodeBytes) throws Exception{ final long startMillis = System.currentTimeMillis(); // 无限等待时,millisToWait为null final Long millisToWait = (unit != null) ? unit.toMillis(time) : null; // 创建ZNode节点时的数据内容,无关紧要,这里为null,采用默认值(IP地址) final byte[] localLockNodeBytes = (revocable.get() != null) ? new byte[0] : lockNodeBytes; // 当前已经重试次数,与CuratorFramework的重试策略有关 int retryCount = 0; // 在Zookeeper中创建的临时顺序节点的路径,相当于一把待激活的分布式锁 // 激活条件:同级目录子节点,名称排序最小(排队,公平锁),后续继续分析 String ourPath = null; // 是否已经持有分布式锁 boolean hasTheLock = false; // 是否已经完成尝试获取分布式锁的操作 boolean isDone = false; while ( !isDone ){ isDone = true; try{ // 从InterProcessMutex的构造函数可知实际driver为StandardLockInternalsDriver的实例 // 在Zookeeper中创建临时顺序节点 ourPath = driver.createsTheLock(client, path, localLockNodeBytes); // 循环等待来激活分布式锁,实现锁的公平性,后续继续分析 hasTheLock = internalLockLoop(startMillis, millisToWait, ourPath); } catch ( KeeperException.NoNodeException e ) {// 容错处理,不影响主逻辑的理解,可跳过 // 因为会话过期等原因,StandardLockInternalsDriver因为无法找到创建的临时顺序节点而抛出NoNodeException异常 if ( client.getZookeeperClient().getRetryPolicy().allowRetry(retryCount++, System.currentTimeMillis() - startMillis, RetryLoop.getDefaultRetrySleeper()) ){ // 满足重试策略尝试重新获取锁 isDone = false; } else { // 不满足重试策略则继续抛出NoNodeException throw e; } } } if ( hasTheLock ){ // 成功获得分布式锁,返回临时顺序节点的路径,上层将其封装成锁信息记录在映射表,方便锁重入 return ourPath; } // 获取分布式锁失败,返回null return null;
}
Curator实现分布式锁的基本原理-LockInternals.attemptLock相关推荐
- Curator实现分布式锁的基本原理-LockInternals.internalLockLoop
// 循环等待来激活分布式锁,实现锁的公平性 private boolean internalLockLoop(long startMillis, Long millisToWait, String ...
- Curator实现分布式锁的基本原理
curator是Netflix公司开源的一个ZooKeeper客户端封装.curator 对于锁这块做了一些封装,curator 提供了InterProcessMutex 这样一个 api.除了分布式 ...
- Curator实现分布式锁的基本原理-InterProcessMutex.internalLock
private boolean internalLock(long time, TimeUnit unit) throws Exception{ Thread currentThread = Thre ...
- Curator实现分布式锁的基本原理-构造函数
// 最常用 public InterProcessMutex(CuratorFramework client, String path){// Zookeeper利用path创建临时顺序节点,实现公 ...
- Curator实现分布式锁的基本原理-createsTheLock
// From StandardLockInternalsDriver // 在Zookeeper中创建临时顺序节点 public String createsTheLock(CuratorFrame ...
- Curator实现分布式锁的基本原理-getTheLock
// From StandardLockInternalsDriver public PredicateResults getsTheLock(CuratorFramework client, Lis ...
- Curator实现分布式锁的基本原理-InterProcessMutex.acquire
// 无限等待 public void acquire() throws Exception{ if ( !internalLock(-1, null) ){ throw new IOExceptio ...
- 分布式架构-ZK客户端工具Curator框架分布式锁及基本使用
分布式架构-基于Curator分布式锁及基本使用 一.Curator Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作 ...
- Apache Curator之分布式锁原理(二)
本文主要讲解如下内容: 为什么要使用分布式锁? 分布式锁特性! 分布式锁的实现方式有哪些? Curator分布式锁原理 Curator分布式锁实现类UML及相关类的介绍 基于Redis,数据库实现分布 ...
最新文章
- java中Volatile修饰符的含义
- ruby 工程的创建 使用JetBrains RubyMine建立rails 工程
- HDU 1848 Fibonacci again and again(博弈)
- 这届产品经理也太太太太难了吧!
- 提高页面显示速度的秘技
- Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行
- ps html css 工具,Photoshop之CSS切图时ps软件常用工具
- php网页文件在,php是网页文件吗
- echarts3 标线markLine
- 美国11月PMI现回落 市场关注10月PCE通膨数据
- 如何查看kali的详细ip地址网关_在Linux中检查默认网关或路由器IP地址的四个命令...
- AI开发者大会:2020年7月3日和7月4日CSDN重磅举办《百万人学AI》大会议程及其对应视频回放链接
- 读懂这三个关键词,就明白迅雷链为什么受开发者欢迎
- 家务计算机配置,笔记本电脑佳配置是什么样的
- 京东图书架构设计有感
- css实现波浪球效果图,用css实现圆形波浪效果图
- 2018年前端年度工作总结
- STM32(一)STM32简介
- python基础-数据类型转换
- 工作流审批平台-系统概述-关联企业应用系统
热门文章
- Luogu-P3205-HNOI2010-合唱队
- 【[SDOI2014]数数】
- MySQL5.7.17源码编译安装与配置
- (素材源代码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
- IIS上的web service调用AX服务问题
- 数字图像基础,论坛,算法库matlab,opencv,halcon
- Mysql一些导入导出数据库,添加修改字段命令
- ---WebCam网络摄像头11 http协议
- Open 5分钟:恺英收集闵懿
- Windows Communication Foundation(WCF) 一步一步从入门到精通