zoukankan      html  css  js  c++  java
  • Zookeeper概念学习系列之zookeeper实现分布式共享锁

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



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

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


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

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

     

      具体,见

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

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/zlslch/p/7242233.html
Copyright © 2011-2022 走看看