Zookeeper概念学习系列之zookeeper实现分布式共享锁
2024-09-07 20:02:00
首先假设有两个线程, 两个线程要同时到mysql中更新一条数据, 对数据库中的数据进行累加更新。由于在分布式环境下, 这两个线程可能存在于不同的机器上的不同jvm进程中, 所以这两个线程的关系就是垮主机跨进程, 使用java中的synchronized锁是搞不定的。
主要利用了zookeeper的临时有序节点的特性和watcher监视器。
我们认为最小的节点具备执行权, 也就是获取到了锁。
临时节点有一个特点: 当创建临时节点的程序停掉之后, 这个临时节点就会消失。
监视器的特点: 可以给 zk 中的节点注册监视器, 监视这个节点的子节点的变化情况监视器注册一次, 只能使用一次。 多次使用需要多次注册 。
大致思路如下:
1: 当这两个线程去mysql更新数据之前, 先到zookeeper的/locks(永久节点)下面注册一个临时有序节点, 这样每个线程都注册了一个临时节点, 两个临时节点肯定是有序的。
线程1: /locks/000000002 线程2: /locks/000000001
2: 当每个线程注册完节点之后, 需要尝试获取锁, 这个时候, 哪个节点最小, 哪个线程就获取到锁, 这个时候, 线程2注册的节点最小, 所以线程2 就获取到锁, 执行更新数据库的代码, 更新完
成之后, 删除自己注册的临时节点。同时线程1会判断自己不是最小的, 所以就会监控比自己小1的那个节点, 当发现那个节点消失的话, 也就意味着它的节点就是最小的节点, 获取锁, 执行更新数据库的代码
具体,见
zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)
最新文章
- BZOJ2506: calc
- LINQ系列:Linq to Object生成操作符
- c++ 时间类型详解 time_t
- linux下配置mysql默认编码utf8
- Android 模拟器genymotion安装,eclipse 插件
- 【译】 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
- 转 :hdoj 4857 逃生【反向拓扑】
- 逆波兰表达式 java
- MFC的初始化过程和消息映射技术
- 开心学习系列学习笔记-----nodejs缺点
- RPATH与RUNPATH
- Java基础:泛型
- Java 新特性(2) - JDK6 新特性
- Java面试题:写代码使得分别出现StackOverflowError和OutOfMemoryError
- 渐进式Web应用(PWA)入门教程(下)
- Vue之虚拟DOM
- JavaScript之小工具之日志log()[兼容]
- HDU 1512 Monkey King(左偏树模板题)
- 阿里云kubernetes被minerd挖矿入侵
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法
热门文章
- neutron DVR
- red入门学习笔记
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
- FAQ: SNMP on NetScaler Appliance
- 【NOIP模拟赛】飞(fly) 数论+树状数组
- [lucene系列笔记2]在eclipse里初步使用lucene的索引和查询功能
- Avito Cool Challenge 2018 A. B题解
- HDU2732:Leapin' Lizards(最大流)
- 汕头市队赛 SRM 07 B 好玩的麻将
- SAR图像处理 MSTAR数据库利用问题