zookeeper实现互斥锁
简单的说,zookeeper就是为了解决集群环境中数据一致性的问题。
举个很简单栗子:
有一个变量A,分别存在于两台服务器中,某个程序需要用到变量A,就随机地访问其中一台服务器并取得变量A的值,对吧?现在有两个客户端分别修改两台服务器上的变量A,其中一个客户端把其中一台服务器的变量A的值修改为1,另一个客户端把另一台服务器的变量A修改为2。那么之后,程序访问取得这个变量的值,到底是1还是2呢?zookeeper就是为了解决这种问题的。
本文主要是讲一个demo,利用zookeeper的特性来实现一个互斥锁,原理性的东西本文不赘述。
我们用多线程的方式来模拟多个客户端争抢锁,线程类代码如下:
public class Thread1 implements Runnable {
ZooKeeper zk = null;
@Override
public void run() {
try {
zk = new ZooKeeper("127.0.0.1:2181", 2000, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 获取事件类型
String type = event.getType().toString();
/**
* 我们使用节点/lock/mylock为锁的标志
* 事件类型为“None”表示线程刚启动,线程启动后就立即去抢锁
* 事件类型为“NodeDeleted”表示有节点被删除了
* ,也就表示有线程释放锁了,当前线程得到事件通知后就立即抢锁
* 。if块里面的代码都是抢锁、处理业务逻辑、释放锁这个流程
*/
if ("None".equals(type) || ("NodeDeleted".equals(type) && event.getPath().equals("/lock/mylock"))) {
try {
// 创建一个/lock/mylock节点,即执行抢锁。如果节点创建失败,则会抛出一个异常,进入下面的catch块中
zk.create("/lock/mylock", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 继续监控/lock/mylock节点的变化情况,因为zookeeper的watcher是一次性的,所以用完后要重新watch
zk.exists("/lock/mylock", true);
// /lock/mylock节点创建成功,表示抢到了锁
System.out.println("----------------------------------");
System.out.println(Thread.currentThread().getName() + "抢到锁了");
System.out.println(Thread.currentThread().getName() + "处理业务逻辑……");
Thread.sleep(2000);
// 删除/lock/mylock节点,释放锁,之后所有的watch这个节点的线程都会收到事件通知,从而立即抢锁
zk.delete("/lock/mylock", -1);
System.out.println(Thread.currentThread().getName() + "已释放锁");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + "没抢到锁");
try {
// 抢锁失败,继续监控锁标志节点的变化情况
zk.exists("/lock/mylock", true);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
main函数代码如下:
for (int i = 0; i < 5; i++) {
new Thread(new Thread1()).start();
}
System.in.read();
运行结果:
Thread-3-EventThread抢到锁了
Thread-3-EventThread处理业务逻辑……
Thread-2-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-0-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-3-EventThread已释放锁
----------------------------------
Thread-2-EventThread没抢到锁
Thread-0-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-3-EventThread没抢到锁
Thread-4-EventThread抢到锁了
Thread-4-EventThread处理业务逻辑……
Thread-4-EventThread已释放锁
----------------------------------
Thread-3-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-0-EventThread抢到锁了
Thread-0-EventThread处理业务逻辑……
Thread-0-EventThread已释放锁
----------------------------------
Thread-4-EventThread没抢到锁
Thread-3-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-0-EventThread没抢到锁
Thread-1-EventThread抢到锁了
Thread-1-EventThread处理业务逻辑……
Thread-1-EventThread已释放锁
----------------------------------
Thread-0-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-3-EventThread抢到锁了
Thread-3-EventThread处理业务逻辑……
Thread-3-EventThread已释放锁
----------------------------------
Thread-0-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-3-EventThread没抢到锁
Thread-1-EventThread抢到锁了
Thread-1-EventThread处理业务逻辑……
Thread-1-EventThread已释放锁
----------------------------------
Thread-3-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-0-EventThread抢到锁了
Thread-0-EventThread处理业务逻辑……
Thread-0-EventThread已释放锁
----------------------------------
Thread-2-EventThread没抢到锁
Thread-0-EventThread没抢到锁
Thread-4-EventThread没抢到锁
Thread-1-EventThread没抢到锁
Thread-3-EventThread抢到锁了
Thread-3-EventThread处理业务逻辑……
Thread-3-EventThread已释放锁
----------------------------------
Thread-0-EventThread没抢到锁
Thread-2-EventThread没抢到锁
Thread-3-EventThread没抢到锁
Thread-1-EventThread抢到锁了
Thread-1-EventThread处理业务逻辑……
Thread-4-EventThread没抢到锁
我们可以看到每次只有一个线程获取到了锁,并处理业务逻辑
zookeeper实现互斥锁的更多相关文章
- 基于Zookeeper实现的分布式互斥锁 - InterProcessMutex
Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Z ...
- ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁
前言 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的. 使 ...
- 【连载】redis库存操作,分布式锁的四种实现方式[一]--基于zookeeper实现分布式锁
一.背景 在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求原子性操作,所以绝大多数电商系统都用Redis来实现库存的加减,最近公司项目做架构升级,以 ...
- 6 zookeeper实现分布式锁
zookeeper实现分布式锁 仓库地址:https://gitee.com/J_look/ssm-zookeeper/blob/master/README.md 锁:我们在多线程中接触过,作用就是让 ...
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
- 多线程之互斥锁(By C++)
首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...
- 简单的JavaScript互斥锁
去年有几个项目需要使用JavaScript互斥锁,所以写了几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁
返回目录 在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock ...
随机推荐
- python 继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- HDU 2222 Keywords Search(AC自动机模板题)
学习AC自动机请戳这里:大神blog........ 自动机的模板: #include <iostream> #include <algorithm> #include < ...
- 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...
- 域名的MX设置及校验方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- ThinkPHP 获取配置文件中的值
C('SPECIAL_USER'):获取配置文件中的值 存入数组
- 2015北京网络赛 G题 Boxes bfs
Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...
- materialish-progress
https://github.com/pnikosis/materialish-progress materialish-progress-master.zip
- unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死
unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...
- java_不知道数据类型情况下,数组遍历-反射
if(items.getClass().isArray){ this.collection = new ArrayList(); int length = Array.getLength(items) ...
- php安装ecshop
1.apache2.2正常 2.源码htdoc下面保存不动 3.E:\PHP 安装目录下 php5.3.28 就不支持jpeg php5.2.17 就不支持 mysql 说明就是php的问题,因为其他 ...