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实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章