package com.example.demo3.zk;

import lombok.extern.slf4j.Slf4j;
import org.apache.storm.shade.org.apache.zookeeper.*;
import java.util.concurrent.CountDownLatch; /**
* Zookeeper 初始化,获取锁,释放锁。创建临时锁。
*/
@Slf4j
public class ZooKeeperSession { private static CountDownLatch countDownLatch=new CountDownLatch(1); private ZooKeeper zooKeeper; //目录
private String lockPath="/orderId-lock-"; /**
* 连接zookeeper
*/
public ZooKeeperSession(){
try {
//连接zk服务器
this.zooKeeper=new ZooKeeper("192.168.132.154:2181,192.168.132.156:2181,192.168.132.155:2181",
50000,new ZooKeeperWatcher());
log.info("状态:"+zooKeeper.getState().toString()); try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
log.info("ZooKeeper session 建立......");
} /**
* 获取分布式锁。
* @param orderId
*/
public void acquireDistributeLock(Long orderId) {
String path = lockPath + orderId;
try {
zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
log.info("success to acquire lock for order[id=" + orderId + "]");
} catch (Exception e) {
e.printStackTrace();
int count = 0;
while (true) {
try {
Thread.sleep(20);
zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); } catch (Exception e1) {
e1.printStackTrace();
count++;
continue;
}
log.info("success to acquire lock for order[id=" + orderId + " after " + count + " times try......");
break;
}
}
} /**
* 释放分布式锁。
* @param orderId
*/
public void releaseDistributeLock(Long orderId){
String path = lockPath+orderId;
try {
zooKeeper.delete(path,-1);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
} private class ZooKeeperWatcher implements Watcher{ @Override
public void process(WatchedEvent event) {
log.info("Receive watch event:"+event.getState());
if(Event.KeeperState.SyncConnected == event.getState()){
countDownLatch.countDown();
}
}
} /**
* 封装单例静态内部类。
*/
private static class Singleton{
private static ZooKeeperSession instance; static {
instance=new ZooKeeperSession();
} public static ZooKeeperSession getIntance(){
return instance;
}
} /**
* 获取单例。
* @return
*/
public static ZooKeeperSession getInstance(){
return Singleton.getIntance();
} /**
* 初始化单例方法。
*/
public static void init(){
getInstance();
}
}

调用方法:

package com.example.demo3;

import com.example.demo3.zk.ZooKeeperSession;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test; @Slf4j
public class TestZooKeeper extends Demo3ApplicationTests { /**
* 测试分布式锁。
*/
@Test
public void testZookeeper() {
Long orderId = 1L;
ZooKeeperSession zooKeeperSession = new ZooKeeperSession();
log.info("获取锁");
zooKeeperSession.acquireDistributeLock(orderId);
log.info("执行业务逻辑...");
zooKeeperSession.releaseDistributeLock(orderId);
log.info("释放锁");
} }

运行结果:

源码下载地址:

链接: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. Vue 基础 day06 webpack 3.x 结合vue

    在普通页面使用 render 函数渲染组件 var login = { template: '<h3>login</h3>' } var vm = new Vue({ // c ...

  2. github廖雪峰git

    gitHub地址: https://github.com/DickyQie/Tool-use/tree/git-learning-document

  3. BZOJ 1767] [Ceoi2009] harbingers (斜率优化)

    [BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...

  4. HDUSTOJ-1558 Flooring Tiles(反素数)

    1558: Flooring Tiles 时间限制: 3 Sec  内存限制: 128 MB提交: 59  解决: 36[提交][状态][讨论版] 题目描述 You want to decorate ...

  5. LLVM思想与功能综述

    llvm似乎还有一个奇怪的优化方法:llvm(low level virtual machine)本身就是一种抽象的.虚拟的计算机架构,其特性介于RISC和CISC之间,llvm会先将代码编译为llv ...

  6. Python 批量文件下载

    python文件 批量下载 .图片批量下载 ,批量请求.爬虫 #==================================================================== ...

  7. Flutter 初探 -

    flutter 安装 经过许久的关注,及最近google算是真正地推行flutter时,加上掘金小册也有相应的教程,我知道自己得跟着这一波潮流学习了,不然迟早会面临着小程序的危(大家都会了就你不会), ...

  8. 固定标签(position: fixed)

    document.body.scrollTop 要改成 document.documentElement.scrollTop不然不生效 <!DOCTYPE html> <html l ...

  9. Malware分析

    //文章来源:http://www.2cto.com/Article/201312/265217.html by Kungen@CyberSword 想要查找恶意样本,首先要知道查找样本所需的基本信息 ...

  10. 解析安装mysql

    大多数人在结束咱们前面学习的基础知识的时候,其实一脸懵逼,不过我们已经开始步入了另一个新的高度,针对基础知识还是必须巩固针对性的进行补充,可以分模块总结:比如基础知识的数据结构---->函数-- ...