// From StandardLockInternalsDriver
public PredicateResults getsTheLock(CuratorFramework client, List<String> children, String sequenceNodeName, int maxLeases) throws Exception{ // 之前创建的临时顺序节点在排序后的子节点列表中的索引 int ourIndex = children.indexOf(sequenceNodeName); // 校验之前创建的临时顺序节点是否有效 validateOurIndex(sequenceNodeName, ourIndex); // 锁公平性的核心逻辑 // 由InterProcessMutex的构造函数可知,maxLeases为1,即只有ourIndex为0时,线程才能持有锁,或者说该线程创建的临时顺序节点激活了锁 // Zookeeper的临时顺序节点特性能保证跨多个JVM的线程并发创建节点时的顺序性,越早创建临时顺序节点成功的线程会更早地激活锁或获得锁 boolean getsTheLock = ourIndex < maxLeases; // 如果已经获得了锁,则无需监听任何节点,否则需要监听上一顺序节点(ourIndex-1) // 因为锁是公平的,因此无需监听除了(ourIndex-1)以外的所有节点,这是为了减少羊群效应,非常巧妙的设计!! String pathToWatch = getsTheLock ? null : children.get(ourIndex - maxLeases); // 返回获取锁的结果,交由上层继续处理(添加监听等操作) return new PredicateResults(pathToWatch, getsTheLock);
} static void validateOurIndex(String sequenceNodeName, int ourIndex) throws KeeperException{ if ( ourIndex < 0 ){ // 容错处理,可跳过 // 由于会话过期或连接丢失等原因,该线程创建的临时顺序节点被Zookeeper服务端删除,往外抛出NoNodeException // 如果在重试策略允许范围内,则进行重新尝试获取锁,这会重新重新生成临时顺序节点 // 佩服Curator的作者将边界条件考虑得如此周到! throw new KeeperException.NoNodeException("Sequential path not found: " + sequenceNodeName); }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 云原生中间件与开源自建TCO对比
  2. python saltstack web_saltstack学习-8:web管理页面(halite)
  3. vue-router嵌套路由,默认子路由设置
  4. C++/C--unordered_map常见用法详解
  5. oracle数据库关不掉,oracle进程关不掉的问题??新手问题
  6. rabbitMq消息不可达returnListener的使用
  7. 笔记本计算机属于微型计算机吗,微型计算机和笔记本计算机有什么区别
  8. python之求字典最值
  9. 科技界流传的 OKR 系统有用吗?
  10. 面向对象(Python):学习笔记之单例模式
  11. 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度
  12. java spring boot 项目 热加载 有利于快速开发
  13. spring---FactoryBean与BeanFactory的区别
  14. 深度装机大师一键重装_正确重装系统(1):一键重装系统出现问题解决方法...
  15. 创建最基本的GD32F4xx的工程
  16. 10的多少次方 oracle_Oracle SQL計算平方根、立方根、次方
  17. FastFDS文件服务部署
  18. UG NX 12 抽取面特征
  19. 数据分析在网络营销中的意义有哪些
  20. access 数据库写按日期查询SQL

热门文章

  1. win2000server IIS和tomcat5多站点配置
  2. Git 提交规范-Java程序员收藏必备
  3. USART_GetITStatus和USART_GetFlagStatus的区别
  4. 学习进度条(第十五周)
  5. Hadoop学习第一天
  6. javascript 动态创建tip图片提示
  7. fscanf和feof的组合使用
  8. .net中javascript去调用webservice
  9. Apache虚拟目录和多端口多主机名配置
  10. curl和wget的区别和使用