Zookeeper实现分布式共享锁

论坛 期权论坛     
选择匿名的用户   2021-5-23 11:01   99   0
<ul style="margin-left:.0743in; direction:ltr; unicode-bidi:embed; margin-top:0in; margin-bottom:0in"><li><p style="margin:0in; font-size:10.0pt"><span lang="zh-CN" style="font-family:SimSun">分布式系统中经常需要协调多进程,多个</span><span lang="en-US" style="font-family:Calibri">jvm</span><span lang="zh-CN" style="font-family:SimSun">,或者多台机器之间的同步问题,得益于</span><span lang="en-US" style="font-family:Calibri">zookeeper</span><span lang="zh-CN" style="font-family:SimSun">,实现了一个分布式的共享锁,方便在多台服务器之间竞争资源时,来协调各系统之间的协调和同步。</span></p>
<p style="margin:0in; font-family:SimSun; font-size:10.0pt"> </p>
<div style="direction:ltr">
  <table border="1" cellpadding="0" cellspacing="0" style="direction:ltr; border-collapse:collapse; border-style:solid; border-color:#A3A3A3; border-width:1pt"><tbody><tr><td style="border-style:solid; border-color:#A3A3A3; border-width:1pt; vertical-align:top; width:6.6576in; padding:4pt 4pt 4pt 4pt"> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">package com.concurrent;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> </p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.io.IOException;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.ArrayList;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.Collections;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.List;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.concurrent.CountDownLatch;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.concurrent.TimeUnit;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.concurrent.locks.Condition;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import java.util.concurrent.locks.Lock;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> </p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.CreateMode;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.KeeperException;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.WatchedEvent;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.Watcher;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.ZooDefs;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.ZooKeeper;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">import org.apache.zookeeper.data.Stat;</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> </p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">/**</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">          DistributedLock lock &#61; null;</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">try {<!-- --></p> <p style="margin:0in; margin-left:.75in; font-family:SimSun; font-size:10.0pt">lock &#61; new DistributedLock(&#34;127.0.0.1:2182&#34;,&#34;test&#34;);</p> <p style="margin:0in; margin-left:.75in; font-family:SimSun; font-size:10.0pt">lock.lock();</p> <p style="margin:0in; margin-left:.75in; font-family:SimSun; font-size:10.0pt">//do something...</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">} catch (Exception e) {<!-- --></p> <p style="margin:0in; margin-left:.75in; font-family:SimSun; font-size:10.0pt">e.printStackTrace();</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">} </p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">finally {<!-- --></p> <p style="margin:0in; margin-left:.75in; font-family:SimSun; font-size:10.0pt">if(lock !&#61; null)</p> <p style="margin:0in; margin-left:1.125in; font-family:SimSun; font-size:10.0pt"> lock.unlock();</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">}</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> * &#64;author xueliang</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> *</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt"> */</p> <p style="margin:0in; font-family:SimSun; font-size:10.0pt">public class DistributedLock implements Lock, Watcher{<!-- --></p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private ZooKeeper zk;</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private String root &#61; &#34;/locks&#34;;//根</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private String lockName;//竞争资源的标志</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private String waitNode;//等待前一个锁</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private String myZnode;//当前锁</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private CountDownLatch latch;//计数器</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private int sessionTimeout &#61; 30000;</p> <p style="margin:0in; margin-left:.375in; font-family:SimSun; font-size:10.0pt">private List&lt;Exception&gt;
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP