原理

进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得.

进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当waitPath被删除后, 进程获得通知, 此时说明该进程获得了锁.

lock操作过程:

1、创建一个永久性节点,作锁的根目录

2、当要获取一个锁时,在锁目录下创建一个临时有序列的节点

3、检查锁目录的子节点是否有序列比它小,若有则监听比它小的上一个节点,当前锁处于等待状态

4、当等待时间超过Zookeeper session的连接时间(sessionTimeout)时,当前session过期,Zookeeper自动删除此session创建的临时节点,等待状态结束,获取锁失败

5、当监听器触发时,等待状态结束,获得锁

unlock操作过程:

将自己id对应的节点删除即可,对应的下一个排队的节点就可以收到Watcher事件,从而被唤醒得到锁后退出;

最新文章

  1. php正则表达式治疗结巴
  2. 安卓 io流 写入文件,再读取的基本使用
  3. Bezier曲线的原理 及 二次Bezier曲线的实现
  4. Jquery实现页面上所有的checkbox只能选中一个
  5. 使用pymysql连接MySql数据库
  6. C#控件大小随窗体大小等比例变化
  7. SQL查询四舍五入 解决方法
  8. APUE 1 -- Unix数据结构
  9. [ExtJS5学习笔记]第十一节 Extjs5MVVM模式下系统登录实例
  10. Centos6、7下安装Nginx的两种方法
  11. The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it
  12. python 中numpy中函数hstack用法和作用
  13. public private protected extends
  14. MVC4 原版样式
  15. 补充appium -api
  16. Android-Android版美图秀秀
  17. PHP_EOL 写入字符串换行 , php获取毫秒 microtime
  18. 小程序swiper 快速滑动闪屏
  19. python文件备份与简单操作
  20. 微信小程序-04-详解介绍.json 配置文件

热门文章

  1. vb.net 调用api
  2. WP8日历(含农历)APP
  3. easyui datagrid editor checkbox 单击事件
  4. 首次使用vim
  5. 【习题5-3 UVA-10935】Throwing cards away I
  6. DBeaver无法执行数据库脚本
  7. 自己定义View——坑、技巧、调优
  8. 使用github pages创建博客
  9. go 生成随机小数 指定范围
  10. [RxJS] Hot Observable, by .share()