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 ...
随机推荐
- SQL2008-不同数据库之间的触发器
create trigger tr_update_Table_1 on rwqd FOR UPDATE As update dataabc.dbo.Table_1 set ...
- 解决IE6不支持fixed
/* IE6 是不支持position:fixed的,解决如下*/.right-bar{ _position:absolute;_top:expression(eval(document.docume ...
- weblogic11g 安装——linux 无图形界面
weblogic11g 安装——linux下无weblogic安装图形界面 注意:此次安装,没做server.ip .系统规划 目的:学习weblogic11g 在linux下 无图形安装的过程 j ...
- cocos2d-x Sprite
转自:http://codingnow.cn/cocos2d-x/795.html 精灵是游戏中十分重要的组成部分,随处可见,如:游戏背景.NPC.人物.道具等.在cocos2d-x引擎中,只要是用图 ...
- Windows下配置PHP支持LDAP扩展方法(wampserver)
在网上搜了好多文章都不行呢,大都是没有开启扩展的问题,可是我的是开启的. 终于看到一篇文章,因为我用的是wampserver.下面是文章原话: 然后你发现上面的提示依旧,因为这是网上大多能查到的资料的 ...
- android自动化测试中hierarchyviewer和uiautomatorviewer获取控件信息的方式比对
http://blog.csdn.net/itfootball/article/details/21777835 http://blog.csdn.net/chenbang110/article/de ...
- NodeJs + gm图片缩略图
我的另一篇文章: Nginx/Apache图片缩略图技术 gm官网 1, 软件环境 nodejs npm GraphicsMagick or ImageMagick 貌似ImageMagick在处理大 ...
- 未定义标识符_ConnectionPtr
我的编译环境 vs2010 你会明白的图片,那么多 无用!
- Ajax防止重复提交
转:http://www.cnblogs.com/jinguangguo/archive/2013/05/20/3086925.html 谈谈防止重复点击提交 首先说说防止重复点击提交是什么意思. ...
- WSGI、flup、fastcgi、web.py的关系
Apache/lighttpd: 相当于一个request proxy,根据配置,把不同的请求转发给不同的server处理,例如静态的文件请求自己处理,这个时候它就像一个web server,对于fa ...