首先假设有两个线程, 两个线程要同时到mysql中更新一条数据, 对数据库中的数据进行累加更新。由于在分布式环境下, 这两个线程可能存在于不同的机器上的不同jvm进程中, 所以这两个线程的关系就是垮主机跨进程, 使用java中的synchronized锁是搞不定的。

  主要利用了zookeeper的临时有序节点的特性和watcher监视器
  我们认为最小的节点具备执行权, 也就是获取到了锁。

  临时节点有一个特点: 当创建临时节点的程序停掉之后, 这个临时节点就会消失。
  监视器的特点: 可以给 zk 中的节点注册监视器, 监视这个节点的子节点的变化情况监视器注册一次, 只能使用一次。 多次使用需要多次注册 。

大致思路如下:
  1: 当这两个线程去mysql更新数据之前, 先到zookeeper的/locks(永久节点)下面注册一个临时有序节点, 这样每个线程都注册了一个临时节点, 两个临时节点肯定是有序的。
  线程1: /locks/000000002 线程2: /locks/000000001

  2: 当每个线程注册完节点之后, 需要尝试获取锁, 这个时候, 哪个节点最小, 哪个线程就获取到锁, 这个时候, 线程2注册的节点最小, 所以线程2 就获取到锁, 执行更新数据库的代码, 更新完
  成之后, 删除自己注册的临时节点。同时线程1会判断自己不是最小的, 所以就会监控比自己小1的那个节点, 当发现那个节点消失的话, 也就意味着它的节点就是最小的节点, 获取锁, 执行更新数据库的代码

  具体,见

zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)

最新文章

  1. BZOJ2506: calc
  2. LINQ系列:Linq to Object生成操作符
  3. c++ 时间类型详解 time_t
  4. linux下配置mysql默认编码utf8
  5. Android 模拟器genymotion安装,eclipse 插件
  6. 【译】 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
  7. 转 :hdoj 4857 逃生【反向拓扑】
  8. 逆波兰表达式 java
  9. MFC的初始化过程和消息映射技术
  10. 开心学习系列学习笔记-----nodejs缺点
  11. RPATH与RUNPATH
  12. Java基础:泛型
  13. Java 新特性(2) - JDK6 新特性
  14. Java面试题:写代码使得分别出现StackOverflowError和OutOfMemoryError
  15. 渐进式Web应用(PWA)入门教程(下)
  16. Vue之虚拟DOM
  17. JavaScript之小工具之日志log()[兼容]
  18. HDU 1512 Monkey King(左偏树模板题)
  19. 阿里云kubernetes被minerd挖矿入侵
  20. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法

热门文章

  1. neutron DVR
  2. red入门学习笔记
  3. [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
  4. FAQ: SNMP on NetScaler Appliance
  5. 【NOIP模拟赛】飞(fly) 数论+树状数组
  6. [lucene系列笔记2]在eclipse里初步使用lucene的索引和查询功能
  7. Avito Cool Challenge 2018 A. B题解
  8. HDU2732:Leapin' Lizards(最大流)
  9. 汕头市队赛 SRM 07 B 好玩的麻将
  10. SAR图像处理 MSTAR数据库利用问题