简单的说,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. Android 画图类View与SurfaceView之学习

    在开发游戏开发中,android相应的提供了几个重要的模块: 1.显示界面的视图:  Android 提供 View 和 SurfaceView 2.控制游戏整体结构: android 提供 Acti ...

  2. Java/Andriod- 使用Eclipse搭建环境

    从网上找来的,做了一点小修改,我自己试了一下,1.3步骤我没去做,最后也不影响. 在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.环 ...

  3. linux和windows文件名称长度限制

    Linux文件名称的长度限制是255个字符 windows下全然限定文件名称必须少于260个字符,文件夹名必须小于248个字符. linux下文件数.文件夹数.文件名称长度的各种限制 下面測试都是在没 ...

  4. Andorid4.x 流氓式屏蔽HOME键

    转载请列明出处 http://blog.csdn.net/steelychen/article/details/37757341 应用项目须要要屏蔽HOME键. 项目本身的要求是让按下HOME键后程序 ...

  5. Ewebeditor最新漏洞及漏洞大全

    Ewebeditor最新漏洞及漏洞大全[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  6. c# 调用 c++写的DLL

    http://www.cnblogs.com/MarsPanda/archive/2012/09/03/2668522.html 解决办法 安装 vcredist 运行库 或者用VC6.0编写DLL ...

  7. 给定一个字符串,仅由a,b,c 3种小写字母组成。

    package com.boco.study; /** * 题目详情 给定一个字符串,仅由a,b,c 3种小写字母组成. 当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出 ...

  8. android学习日记27--Dialog使用及其设计模式

    1.Dialog概述 对话框一般是一个出现在当前Activity之上的一个小窗口,处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功 ...

  9. [MethodImpl(MethodImplOptions.Synchronized)]

    在NopCommerce项目的Nop.Core类库中有一个EngineContext类中有一个Initialize方法用到了[MethodImpl(MethodImplOptions.Synchron ...

  10. Events

    Events The idea behind Events is the ability to send data, as parameters, to interested Listeners an ...