简单的说,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实现互斥锁的更多相关文章

  1. 基于Zookeeper实现的分布式互斥锁 - InterProcessMutex

    Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Z ...

  2. ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁

    前言 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的. 使 ...

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

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

  4. 6 zookeeper实现分布式锁

    zookeeper实现分布式锁 仓库地址:https://gitee.com/J_look/ssm-zookeeper/blob/master/README.md 锁:我们在多线程中接触过,作用就是让 ...

  5. ucos实时操作系统学习笔记——任务间通信(互斥锁)

    想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...

  6. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  7. 简单的JavaScript互斥锁

    去年有几个项目需要使用JavaScript互斥锁,所以写了几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...

  8. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  9. 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁

    返回目录 在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock ...

随机推荐

  1. SQL2008-不同数据库之间的触发器

    create trigger tr_update_Table_1   on   rwqd     FOR  UPDATE   As   update dataabc.dbo.Table_1  set ...

  2. 解决IE6不支持fixed

    /* IE6 是不支持position:fixed的,解决如下*/.right-bar{ _position:absolute;_top:expression(eval(document.docume ...

  3. weblogic11g 安装——linux 无图形界面

    weblogic11g 安装——linux下无weblogic安装图形界面 注意:此次安装,没做server.ip .系统规划 目的:学习weblogic11g 在linux下  无图形安装的过程 j ...

  4. cocos2d-x Sprite

    转自:http://codingnow.cn/cocos2d-x/795.html 精灵是游戏中十分重要的组成部分,随处可见,如:游戏背景.NPC.人物.道具等.在cocos2d-x引擎中,只要是用图 ...

  5. Windows下配置PHP支持LDAP扩展方法(wampserver)

    在网上搜了好多文章都不行呢,大都是没有开启扩展的问题,可是我的是开启的. 终于看到一篇文章,因为我用的是wampserver.下面是文章原话: 然后你发现上面的提示依旧,因为这是网上大多能查到的资料的 ...

  6. android自动化测试中hierarchyviewer和uiautomatorviewer获取控件信息的方式比对

    http://blog.csdn.net/itfootball/article/details/21777835 http://blog.csdn.net/chenbang110/article/de ...

  7. NodeJs + gm图片缩略图

    我的另一篇文章: Nginx/Apache图片缩略图技术 gm官网 1, 软件环境 nodejs npm GraphicsMagick or ImageMagick 貌似ImageMagick在处理大 ...

  8. 未定义标识符_ConnectionPtr

    我的编译环境 vs2010 你会明白的图片,那么多 无用!

  9. Ajax防止重复提交

    转:http://www.cnblogs.com/jinguangguo/archive/2013/05/20/3086925.html 谈谈防止重复点击提交   首先说说防止重复点击提交是什么意思. ...

  10. WSGI、flup、fastcgi、web.py的关系

    Apache/lighttpd: 相当于一个request proxy,根据配置,把不同的请求转发给不同的server处理,例如静态的文件请求自己处理,这个时候它就像一个web server,对于fa ...