zooKeeper实现分布式锁

Posted web-spring

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zooKeeper实现分布式锁相关的知识,希望对你有一定的参考价值。

利用zooKeeper的节点写入之后不能再次写入的特点做分布式锁,也可以利用有序节点,然后判断当前的节点是否是最后一个节点,目前我所知道的就这两种,如果你有更好的,希望你能在下方评论里打出,或者给我一个连接

这儿只给出利用节点不能再次写入的特点的代码,话不多说,直接上代码

  1 package upAndDownLine.zooLock;
  2 
  3 import org.apache.zookeeper.CreateMode;
  4 import org.apache.zookeeper.KeeperException;
  5 import org.apache.zookeeper.ZooDefs;
  6 import org.apache.zookeeper.ZooKeeper;
  7 import org.apache.zookeeper.data.Stat;
  8 
  9 import java.io.IOException;
 10 
 11 public class ZookeeperLock {
 12     //集群的地址 ip:端口;这儿测试的时候可以使用单机模式
 13     private static String connectionStr = "masterNode1:2181,slaveNode1:2181,slaveNode2:2181";
 14     private static ZooKeeper zooKeeper = null;
 15     private static String PATH="/lockss";
 16     //要竞争的资源的总数 :小姐姐的人数
 17     private static int n = 100;
 18     //模拟有多少人来竞争这个共享资源 :单身汪的人数
 19     private static int i = 120;
 20     //计算有多少人竞争共享资源失败 :没带走小姐姐的人数
 21     private static int m = 0;
 22     //要竞争的资源标示  :小姐姐们的标示
 23     private static String id ="123";
 24 
 25     public static boolean tryLock() {
 26         try {
 27             
 28             boolean b = true;
 29             //建立链接
 30             zooKeeper = new ZooKeeper(connectionStr,5000,null);
 31             //判断zookeeper是否已经存在 PATH 这个节点
 32             Stat stat = zooKeeper.exists(PATH, false);
 33             //如果为空则创建这个节点
 34             if (stat == null){
 35                 zooKeeper.create(PATH,"100".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
 36             }
 37             //循环创建直到创建成功
 38             while (b){
 39                 //创建零时节点
 40                 try {
 41                     zooKeeper.create(PATH +"/"+id, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
 42                     
 43                 } catch (KeeperException e) {
 44                     e.printStackTrace();
 45                 } catch (InterruptedException e) {
 46                     e.printStackTrace();
 47                 }
 48                 //创建成功则跳出循环
 49                 b = false;
 50             }
 51             //创建成功则加锁成功
 52             return true;
 53 
 54         } catch (Exception e) {
 55             e.printStackTrace();
 56             return false;
 57         }
 58     }
 59 
 60     /**
 61      * 加锁成功后执行逻辑代码完成后删除该锁
 62      */
 63     public static void unLock(){
 64         try {
 65             zooKeeper.delete(PATH+"/"+id,-1);
 66         } catch (InterruptedException e) {
 67 //            e.printStackTrace();
 68         } catch (KeeperException e) {
 69 //            e.printStackTrace();
 70         }
 71     }
 72 
 73     public static void thread(){
 74         for (int f=0;f < i; f++){
 75             new Thread() {
 76                 public void run(){
 77                     try {
 78                         //模拟执行逻辑操作的耗时操作 :单身汪展示自己的实力
 79                         Thread.sleep(10000);
 80                     } catch (InterruptedException e) {
 81                         e.printStackTrace();
 82                     }
 83                     Long start = System.currentTimeMillis();
 84                     //只对涉及共享资源的数据进行加锁,减小锁的力度
 85                     if (tryLock()){
 86                         if (n > 0){
 87                             System.out.println("当前小姐姐还有"+(--n));
 88                             //解锁
 89                             unLock();
 90                         }else {
 91                             System.out.println("当前小姐姐已被单身汪带走完了,请下次早来");
 92                             //没有竞争到共享资源的人数+1
 93                             m++;
 94                         }
 95 
 96 //                        System.out.println((System.currentTimeMillis()-start)+"ms");
 97                     }
 98                 }
 99             }.start();
100         }
101     }
102 
103     public static void main(String[] args) {
104         System.out.println("目前单身汪剩余人数:"+i);
105         System.out.println("目前小姐姐人数"+n);
106         thread();
107         try {
108             Thread.sleep(20000);
109         } catch (InterruptedException e) {
110             e.printStackTrace();
111         }
112         System.out.println("目前单身汪剩余人数:"+m);
113         System.out.println("目前小姐姐人数"+n);
114     }
115 }

这儿使用多线程来模拟多人运动

 

以上是关于zooKeeper实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper分布式锁

zooKeeper实现分布式锁

基于zookeeper的分布式锁实现

zookeeper怎么实现分布式锁

基于Zookeeper实现的分布式互斥锁 - InterProcessMutex

ZooKeeper实现读写锁