ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

zooKeeper实现分布式锁

2020-06-11 12:52:40  阅读:205  来源: 互联网

标签:小姐姐 实现 zooKeeper System static println out 分布式


利用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,System,static,println,out,分布式
来源: https://www.cnblogs.com/Web-spring/p/13092510.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有