zookeeper分布式锁用法
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分布式锁用法的更多相关文章
- ZooKeeper分布式锁的实现原理
七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...
- Curator实现zookeeper分布式锁的基本原理
一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...
- Zookeeper 分布式锁 (图解+秒懂+史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- Curator Zookeeper分布式锁
Curator Zookeeper分布式锁 pom.xml中添加如下配置 <!-- https://mvnrepository.com/artifact/org.apache.curator/c ...
- ZooKeeper 分布式锁实现
1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...
- ZooKeeper分布式锁浅谈(一)
一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- 跟着大神学zookeeper分布式锁实现-----来自Ruthless
前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...
- zookeeper分布式锁
摘要:分享牛原创,zookeeper使用,zookeeper锁在实际项目开发中还是很常用的,在这里我们介绍一下zookeeper分布式锁的使用,以及我们如何zookeeper分布式锁的原理.zooke ...
随机推荐
- Vue 基础 day06 webpack 3.x 结合vue
在普通页面使用 render 函数渲染组件 var login = { template: '<h3>login</h3>' } var vm = new Vue({ // c ...
- github廖雪峰git
gitHub地址: https://github.com/DickyQie/Tool-use/tree/git-learning-document
- BZOJ 1767] [Ceoi2009] harbingers (斜率优化)
[BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...
- HDUSTOJ-1558 Flooring Tiles(反素数)
1558: Flooring Tiles 时间限制: 3 Sec 内存限制: 128 MB提交: 59 解决: 36[提交][状态][讨论版] 题目描述 You want to decorate ...
- LLVM思想与功能综述
llvm似乎还有一个奇怪的优化方法:llvm(low level virtual machine)本身就是一种抽象的.虚拟的计算机架构,其特性介于RISC和CISC之间,llvm会先将代码编译为llv ...
- Python 批量文件下载
python文件 批量下载 .图片批量下载 ,批量请求.爬虫 #==================================================================== ...
- Flutter 初探 -
flutter 安装 经过许久的关注,及最近google算是真正地推行flutter时,加上掘金小册也有相应的教程,我知道自己得跟着这一波潮流学习了,不然迟早会面临着小程序的危(大家都会了就你不会), ...
- 固定标签(position: fixed)
document.body.scrollTop 要改成 document.documentElement.scrollTop不然不生效 <!DOCTYPE html> <html l ...
- Malware分析
//文章来源:http://www.2cto.com/Article/201312/265217.html by Kungen@CyberSword 想要查找恶意样本,首先要知道查找样本所需的基本信息 ...
- 解析安装mysql
大多数人在结束咱们前面学习的基础知识的时候,其实一脸懵逼,不过我们已经开始步入了另一个新的高度,针对基础知识还是必须巩固针对性的进行补充,可以分模块总结:比如基础知识的数据结构---->函数-- ...