// 循环等待来激活分布式锁,实现锁的公平性
private boolean internalLockLoop(long startMillis, Long millisToWait, String ourPath) throws Exception { // 是否已经持有分布式锁 boolean haveTheLock = false; // 是否需要删除子节点 boolean doDelete = false; try { if (revocable.get() != null) { client.getData().usingWatcher(revocableWatcher).forPath(ourPath); } while ((client.getState() == CuratorFrameworkState.STARTED) && !haveTheLock) { // 获取排序后的子节点列表 List<String> children = getSortedChildren(); // 获取前面自己创建的临时顺序子节点的名称 String sequenceNodeName = ourPath.substring(basePath.length() + 1); // 实现锁的公平性的核心逻辑,看下面的分析 PredicateResults predicateResults = driver.getsTheLock(client, children , sequenceNodeName , maxLeases); if (predicateResults.getsTheLock()) { // 获得了锁,中断循环,继续返回上层 haveTheLock = true; } else { // 没有获得到锁,监听上一临时顺序节点 String previousSequencePath = basePath + "/" + predicateResults.getPathToWatch(); synchronized (this) { try { // exists()会导致导致资源泄漏,因此exists()可以监听不存在的ZNode,因此采用getData() // 上一临时顺序节点如果被删除,会唤醒当前线程继续竞争锁,正常情况下能直接获得锁,因为锁是公平的 client.getData().usingWatcher(watcher).forPath(previousSequencePath); if (millisToWait != null) { millisToWait -= (System.currentTimeMillis() - startMillis); startMillis = System.currentTimeMillis(); if (millisToWait <= 0) { doDelete = true; // 获取锁超时,标记删除之前创建的临时顺序节点 break; } wait(millisToWait);// 等待被唤醒,限时等待 } else { wait(); // 等待被唤醒,无限等待 } } catch (KeeperException.NoNodeException e) { // 容错处理,逻辑稍微有点绕,可跳过,不影响主逻辑的理解 // client.getData()可能调用时抛出NoNodeException,原因可能是锁被释放或会话过期(连接丢失)等 // 这里并没有做任何处理,因为外层是while循环,再次执行driver.getsTheLock时会调用validateOurIndex  // 此时会抛出NoNodeException,从而进入下面的catch和finally逻辑,重新抛出上层尝试重试获取锁并删除临时顺序节点 } } } } } catch (Exception e) { ThreadUtils.checkInterrupted(e); // 标记删除,在finally删除之前创建的临时顺序节点(后台不断尝试) doDelete = true; // 重新抛出,尝试重新获取锁 throw e; } finally { if (doDelete) { deleteOurPath(ourPath); } } return haveTheLock;
}

Curator实现分布式锁的基本原理-LockInternals.internalLockLoop相关推荐

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

    // 尝试获取锁,并返回锁对应的Zookeeper临时顺序节点的路径 String attemptLock(long time, TimeUnit unit, byte[] lockNodeBytes ...

  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. 用gensim学习word2vec
  2. web.py搭建服务器
  3. TCP/IP详解--第二十章
  4. 网站推广期间出现排名异常网站推广专员应如何应对?
  5. 玩转Mixly – 5、Arduino AVR编程 之 逻辑
  6. 简易的bbs论坛开发过程上(后台开发)
  7. SAP Cloud for Customer OData v1和v2的区别
  8. 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(9)--基于表单库的仪表板...
  9. java复习系列[5] - Java 中的设计模式
  10. html5数组循环右移,下面的程序代码实现将一个一维数组中元素向右循环移动 移位次数由文本框Text输入。例如数组各元素...
  11. 扇贝有道180910每日一句
  12. Java实现微信小程序登录(服务端)
  13. win10未检测到任何音频设备解决办法
  14. php 程序设计代码教程
  15. office, pdf, cad 等在线预览
  16. android graphview使用与感受
  17. Solidity编程语言
  18. 【python实战】二:乒乓球比赛对手问题
  19. 如何安装Eclipse WTP插件
  20. STM32-esp8266-MQTT服务器通信

热门文章

  1. MBA必读:不能触碰的5大职场高压线
  2. UDP和TCP协议包大小的计算
  3. codevs 1230【pb_ds】
  4. 转Delphi中Create(nil),Create(self),Create(Application)区别
  5. C++学习33 函数模板
  6. 你写的前端到底用没用到这些
  7. modbus-rtu qt4-serialport3--------micro2440 as device
  8. Android 动画 介绍与使用
  9. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇...
  10. vue中过滤器比较两个数组取相同值