本来想着基于zk临时节点,实现一下分布式锁,结果发现有curator框架。PS:原声API真的难用,连递归创建path都没有?

配置curator maven的时候,md配置了好几个小时,最后发现集中定义依赖版本号 我本来都是写数字的,结果到了zookeeper.version ,我竟然写了 <zookeeper.version>zookeeper-3.4.7</zookeeper.version> 把英文也写上去了 可能是从maven-repository copy过来的 很郁闷。

curator提供的可重入分布式锁看起来也没什么可封装的,因为它和ReentrantLock确实很。在需要的地方,new一个,再调用对象的方法就好了。

这个锁就是 InterProcessMutex 类,其构造方法需要我们传入当前CuratorFramework对象,还有要锁定的节点。对了 这个节点是临时节点,再客户端断开连接后,锁不会一直存在,但也不会立即就失去锁,因为ZK需要根据缺省的时间判断你是真的断开了还是某种网络原因。

首先说明它是一把可重入锁。注意在当前线程的for循环中,他们都是用的是同一把锁,同把锁才可重入。

    public void fun() {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
try {
lock.acquire();
System.out.println("yes");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

其次模拟分布式环境,在十个线程中各获取锁(锁相同的path),并执行1s的任务,可以发现,多线程被锁同步。

public void fun() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() { try {
lock.acquire();
System.out.println("yes");
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
} }
}).start();
}
System.in.read();
}

acquire支持传递等待超时时间,返回值是boolean类型。代表超时时间内是否成功获取到锁。

public void fun() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
System.out.println(curatorFramework);
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() { try {
if (lock.acquire(1000, TimeUnit.MILLISECONDS)) {
System.out.println("yes");
Thread.sleep(1000);
} else {
System.out.println("no");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
} }
}).start();
}
System.in.read();
}

最后附上spring配置:

    <!-- 重连配置 -->
<bean id="retryPolicy" class="org.apache.curator.retry.ExponentialBackoffRetry">
<constructor-arg index="0" value="1000"/>
<constructor-arg index="1" value="3"/>
</bean> <bean id="curatorFramework" class="org.apache.curator.framework.CuratorFrameworkFactory" factory-method="newClient"
init-method="start">
<constructor-arg index="0" value="server:port,server:port,server:port"/>
<constructor-arg index="1" ref="retryPolicy"/>
</bean>

Zookeeper+Curator 分布式锁的更多相关文章

  1. zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  2. 基于Zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  3. curator 分布式锁InterProcessMutex

    写这篇文章的目的主要是为了记录下自己在zookeeper 锁上踩过的坑,以及踩坑之后自己的一点认识; 从zk分布式锁原理说起,原理很简单,大家也应该都知道,简单的说就是zookeeper实现分布式锁是 ...

  4. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心

    一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...

  5. 10分钟看懂!基于Zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  6. java就业指南 zookeeper分布式系统 zookeeper实现分布式锁 有用

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个 分布式系统都无法同时满足一致性(Consistency).可用性 ...

  7. 【连载】redis库存操作,分布式锁的四种实现方式[一]--基于zookeeper实现分布式锁

    一.背景 在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求原子性操作,所以绝大多数电商系统都用Redis来实现库存的加减,最近公司项目做架构升级,以 ...

  8. SpringBoot电商项目实战 — Zookeeper的分布式锁实现

    上一篇演示了基于Redis的Redisson分布式锁实现,那今天我要再来说说基于Zookeeper的分布式现实. Zookeeper分布式锁实现 要用Zookeeper实现分布式锁,我就不得不说说zo ...

  9. 分布式锁(3) ----- 基于zookeeper的分布式锁

    分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...

随机推荐

  1. 理解 Continuation

    理解 Continuation (2012-08-26 10:39:34)     终于,我也不能免俗地要来谈谈这几个 Schemer 的必谈话题(顺便山寨了一个标题). Scheme 是一门神奇的编 ...

  2. FortiGate 硬件加速

    FortiGate 硬件加速 来源 https://wenku.baidu.com/view/07749195a1c7aa00b52acb63.html 硬件加速 来源 https://blog.cs ...

  3. 【题解】 [ZJOI2009]假期的宿舍 (二分图匹配)

    懒得复制题面,戳我 Solution: 处理出床位.要留校的人(注意来访问的人一定住校),和人与人的关系(连边) 再接着就是二分图. 注意的就是连向的人必须是有床位的 还要注意的就是只用判断住校的同学 ...

  4. 学习Spring Boot:(十六)使用Shiro与JWT 实现认证服务

    前言 需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时access_token进行资源访问.这里我们将使用 JWT 1,基于散列的消息认证码,使用一 ...

  5. POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)

    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...

  6. QeePHP View视图的默认变量与新增变量

    新版本的QeePHP(V13.1)中,视图页面已经默认添加了几个常用变量 $_app; //控制器所属的应用程序 $_login_user;  //登陆用户信息 直接在视图页面直接使用变量即可. 如果 ...

  7. Oracle DBMS_RANDOM

    DBMS_RANDOM.VALUE -- [0,1)的38位精度小数 SELECT DBMS_RANDOM.VALUE FROM DUAL; -- [10,20)的38位精度小数 SELECT DBM ...

  8. INF文件详解

    安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件,一般以INF作为扩展名,因此也叫INF文件.安装信息INF文件与Windows内建的安装服务引擎(AP ...

  9. CCNA学习与实验指南——第3章 以太网

    以太网就是局域网,IEEE制定了802.2和802.3两种标准.802.2规定了OSI模型的数据链路层的上半部分(LLC子层),802.3规定了OSI模型的数据链路层的下半部分和物理层(MAC子层). ...

  10. 获取web页面xpath

    1. Open Chrome 2. Right click the element that you want to get xpath 3. select "Inspector" ...