作家
登录

基于Zookeeper的分布式锁

作者: 来源: 2017-10-24 13:07:50 阅读 我要评论

  •  
  •     //这里处理同线程的可重人道,如不雅已经获得锁,那么只是在对应的数据构造中增长acquire的次数统计,直接返回成功 
  •     Thread currentThread = Thread.currentThread(); 
  •     LockData lockData = threadData.get(currentThread); 
  •     if ( lockData != null ) 
  •     { 
  •         // re-entering 
  •         lockData.lockCount.incrementAndGet(); 
  •         return true
  •     } 
  •  
  •     //这里才真正去zookeeper中获取锁 
  •     String lockPath = internals.attemptLock(time, unit, getLockNodeBytes()); 
  •     if ( lockPath != null ) 
  •     { 
  •         //获得锁之后,记录当前的线程获得锁的信息,在重入时只需在LockData中增长次数统计即可 
  •         LockData newLockData = new LockData(currentThread, lockPath); 
  •         threadData.put(currentThread, newLockData); 
  •         return true
  •     } 
  •  
  •     //在壅塞返回时仍然获取不到锁,这里高低文的处理隐含的意思为zookeeper通信异常 
  •     return false
  • 代码中增长了具体注释,不做展开。看下zookeeper获取锁的具体实现:

    1. String attemptLock(long time, TimeUnit unit, byte[] lockNodeBytes) throws Exception 
    2.     //参数初始化,此处省略 
    3.     //... 
    4.     
    5.     //自旋获取锁 
    6.     while ( !isDone ) 
    7.     { 
    8.         isDone = true
    9.  
    10.         try 
    11.         { 
    12.             //在锁空间下创建临时且有序的子节点 
    13.             ourPath = driver.createsTheLock(client, path, localLockNodeBytes); 
    14.             //断定是否获得锁(子节点序号最小),获得锁则直接返回,不然壅塞等待前一个子节点删除通知 
    15.             hasTheLock = internalLockLoop(startMillis, millisToWait, ourPath); 
    16.         } 
    17.         catch ( KeeperException.NoNodeException e ) 
    18.         { 
    19.             //对于NoNodeException,代码中确保了只有产生session过时才会在这里抛出NoNodeException,是以这里根据重试策略进行重试 

        推荐阅读

        一文读懂深度学习与机器学习的差异

      沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!“计算机法度榜样可以在给定某种类其余义务 T 和机能度量 P 下进修经验 E ,如不雅其在义务 T 中的机能正好可以用 P>>>详细阅读


      本文标题:基于Zookeeper的分布式锁

      地址:http://www.17bianji.com/lsqh/38128.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)