// 尝试获取锁,并返回锁对应的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相关推荐

  1. Curator实现分布式锁的基本原理-LockInternals.internalLockLoop

    // 循环等待来激活分布式锁,实现锁的公平性 private boolean internalLockLoop(long startMillis, Long millisToWait, String ...

  2. Curator实现分布式锁的基本原理

    curator是Netflix公司开源的一个ZooKeeper客户端封装.curator 对于锁这块做了一些封装,curator 提供了InterProcessMutex 这样一个 api.除了分布式 ...

  3. Curator实现分布式锁的基本原理-InterProcessMutex.internalLock

    private boolean internalLock(long time, TimeUnit unit) throws Exception{ Thread currentThread = Thre ...

  4. Curator实现分布式锁的基本原理-构造函数

    // 最常用 public InterProcessMutex(CuratorFramework client, String path){// Zookeeper利用path创建临时顺序节点,实现公 ...

  5. Curator实现分布式锁的基本原理-createsTheLock

    // From StandardLockInternalsDriver // 在Zookeeper中创建临时顺序节点 public String createsTheLock(CuratorFrame ...

  6. Curator实现分布式锁的基本原理-getTheLock

    // From StandardLockInternalsDriver public PredicateResults getsTheLock(CuratorFramework client, Lis ...

  7. Curator实现分布式锁的基本原理-InterProcessMutex.acquire

    // 无限等待 public void acquire() throws Exception{ if ( !internalLock(-1, null) ){ throw new IOExceptio ...

  8. 分布式架构-ZK客户端工具Curator框架分布式锁及基本使用

    分布式架构-基于Curator分布式锁及基本使用 一.Curator Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作 ...

  9. Apache Curator之分布式锁原理(二)

    本文主要讲解如下内容: 为什么要使用分布式锁? 分布式锁特性! 分布式锁的实现方式有哪些? Curator分布式锁原理 Curator分布式锁实现类UML及相关类的介绍 基于Redis,数据库实现分布 ...

最新文章

  1. java中Volatile修饰符的含义
  2. ruby 工程的创建 使用JetBrains RubyMine建立rails 工程
  3. HDU 1848 Fibonacci again and again(博弈)
  4. 这届产品经理也太太太太难了吧!
  5. 提高页面显示速度的秘技
  6. Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行
  7. ps html css 工具,Photoshop之CSS切图时ps软件常用工具
  8. php网页文件在,php是网页文件吗
  9. echarts3 标线markLine
  10. 美国11月PMI现回落 市场关注10月PCE通膨数据
  11. 如何查看kali的详细ip地址网关_在Linux中检查默认网关或路由器IP地址的四个命令...
  12. AI开发者大会:2020年7月3日和7月4日CSDN重磅举办《百万人学AI》大会议程及其对应视频回放链接
  13. 读懂这三个关键词,就明白迅雷链为什么受开发者欢迎
  14. 家务计算机配置,笔记本电脑佳配置是什么样的
  15. 京东图书架构设计有感
  16. css实现波浪球效果图,用css实现圆形波浪效果图
  17. 2018年前端年度工作总结
  18. STM32(一)STM32简介
  19. python基础-数据类型转换
  20. 工作流审批平台-系统概述-关联企业应用系统

热门文章

  1. Luogu-P3205-HNOI2010-合唱队
  2. 【[SDOI2014]数数】
  3. MySQL5.7.17源码编译安装与配置
  4. (素材源代码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
  5. IIS上的web service调用AX服务问题
  6. 数字图像基础,论坛,算法库matlab,opencv,halcon
  7. Mysql一些导入导出数据库,添加修改字段命令
  8. ---WebCam网络摄像头11 http协议
  9. Open 5分钟:恺英收集闵懿
  10. Windows Communication Foundation(WCF) 一步一步从入门到精通