1. package com.example.demo3.zk;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.storm.shade.org.apache.zookeeper.*;
  5. import java.util.concurrent.CountDownLatch;
  6.  
  7. /**
  8. * Zookeeper 初始化,获取锁,释放锁。创建临时锁。
  9. */
  10. @Slf4j
  11. public class ZooKeeperSession {
  12.  
  13. private static CountDownLatch countDownLatch=new CountDownLatch(1);
  14.  
  15. private ZooKeeper zooKeeper;
  16.  
  17. //目录
  18. private String lockPath="/orderId-lock-";
  19.  
  20. /**
  21. * 连接zookeeper
  22. */
  23. public ZooKeeperSession(){
  24. try {
  25. //连接zk服务器
  26. this.zooKeeper=new ZooKeeper("192.168.132.154:2181,192.168.132.156:2181,192.168.132.155:2181",
  27. 50000,new ZooKeeperWatcher());
  28. log.info("状态:"+zooKeeper.getState().toString());
  29.  
  30. try {
  31. countDownLatch.await();
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. log.info("ZooKeeper session 建立......");
  39. }
  40.  
  41. /**
  42. * 获取分布式锁。
  43. * @param orderId
  44. */
  45. public void acquireDistributeLock(Long orderId) {
  46. String path = lockPath + orderId;
  47. try {
  48. zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  49. log.info("success to acquire lock for order[id=" + orderId + "]");
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. int count = 0;
  53. while (true) {
  54. try {
  55. Thread.sleep(20);
  56. zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  57.  
  58. } catch (Exception e1) {
  59. e1.printStackTrace();
  60. count++;
  61. continue;
  62. }
  63. log.info("success to acquire lock for order[id=" + orderId + " after " + count + " times try......");
  64. break;
  65. }
  66. }
  67. }
  68.  
  69. /**
  70. * 释放分布式锁。
  71. * @param orderId
  72. */
  73. public void releaseDistributeLock(Long orderId){
  74. String path = lockPath+orderId;
  75. try {
  76. zooKeeper.delete(path,-1);
  77. } catch (InterruptedException e) {
  78. e.printStackTrace();
  79. } catch (KeeperException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83.  
  84. private class ZooKeeperWatcher implements Watcher{
  85.  
  86. @Override
  87. public void process(WatchedEvent event) {
  88. log.info("Receive watch event:"+event.getState());
  89. if(Event.KeeperState.SyncConnected == event.getState()){
  90. countDownLatch.countDown();
  91. }
  92. }
  93. }
  94.  
  95. /**
  96. * 封装单例静态内部类。
  97. */
  98. private static class Singleton{
  99. private static ZooKeeperSession instance;
  100.  
  101. static {
  102. instance=new ZooKeeperSession();
  103. }
  104.  
  105. public static ZooKeeperSession getIntance(){
  106. return instance;
  107. }
  108. }
  109.  
  110. /**
  111. * 获取单例。
  112. * @return
  113. */
  114. public static ZooKeeperSession getInstance(){
  115. return Singleton.getIntance();
  116. }
  117.  
  118. /**
  119. * 初始化单例方法。
  120. */
  121. public static void init(){
  122. getInstance();
  123. }
  124. }

调用方法:

  1. package com.example.demo3;
  2.  
  3. import com.example.demo3.zk.ZooKeeperSession;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.junit.Test;
  6.  
  7. @Slf4j
  8. public class TestZooKeeper extends Demo3ApplicationTests {
  9.  
  10. /**
  11. * 测试分布式锁。
  12. */
  13. @Test
  14. public void testZookeeper() {
  15. Long orderId = 1L;
  16. ZooKeeperSession zooKeeperSession = new ZooKeeperSession();
  17. log.info("获取锁");
  18. zooKeeperSession.acquireDistributeLock(orderId);
  19. log.info("执行业务逻辑...");
  20. zooKeeperSession.releaseDistributeLock(orderId);
  21. log.info("释放锁");
  22. }
  23.  
  24. }

运行结果:

源码下载地址:

链接:https://pan.baidu.com/s/1rgyoxf9lLTjDIWX-Ro5o-Q
提取码:ke31

zookeeper分布式锁用法的更多相关文章

  1. ZooKeeper分布式锁的实现原理

    七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...

  2. Curator实现zookeeper分布式锁的基本原理

    一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...

  3. Zookeeper 分布式锁 (图解+秒懂+史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  4. Curator Zookeeper分布式锁

    Curator Zookeeper分布式锁 pom.xml中添加如下配置 <!-- https://mvnrepository.com/artifact/org.apache.curator/c ...

  5. ZooKeeper 分布式锁实现

    1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...

  6. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  7. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  8. 跟着大神学zookeeper分布式锁实现-----来自Ruthless

    前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...

  9. zookeeper分布式锁

    摘要:分享牛原创,zookeeper使用,zookeeper锁在实际项目开发中还是很常用的,在这里我们介绍一下zookeeper分布式锁的使用,以及我们如何zookeeper分布式锁的原理.zooke ...

随机推荐

  1. ubuntu终端代理之proxychains

    命令行代理 安装proxychains sudo apt install proxychains 配置proxychains sudo vim /etc/proxychains.conf 在proxy ...

  2. SQL的“增删改”

    结构语言分类 DDL(数据定义语言)  create  drop  alter   创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言)   insert  delete ...

  3. java_第一年_JavaWeb(15)

    Filter过滤器,Servlet API 中提供了一个Filter接口,用于实现用户在访问某个目标资源前对其进行拦截: 拦截原理:web服务器通过Filter接口调用doFilter方法,会传递一个 ...

  4. ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)

    ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...

  5. python爬虫相关安装与应用

    1.mysql数据库用于存储大量数据. 2.Navicat for MySQL以图形和表格等形式管理数据库工具. 3.编程语言python3与环境配置 4.pythcharm集成开发环境(社区版)不需 ...

  6. HDU-1269 迷宫城堡(连通分量)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. 从ES6重新认识JavaScript设计模式: 装饰器模式

    1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...

  8. SCUT - 142 - 第n个素数

    https://scut.online/p/142 但是洲阁筛打表还是超时了,打的表不够长吧,在51nod上面要跑5s.要是快10倍得要密1000倍,根本打不出来(时间意义). 暴力check要找的质 ...

  9. JEECG 深度使用培训班 周六周日公开课(一期班)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/25411023 广大技术爱好者:     ...

  10. Web学习之JS总结

    银角大王武Sir的博客地址 银角大王武Sir的博客地址二 1.Javascript的作用域链 由于javascript没有块级作用域,而且每个函数作为一个作用域,如果出现嵌套函数,则就会出现作用域链 ...