目录

一、引入问题

二、了解ZK

三、ZK实现分布式锁过程

四、图解ZK实现分布式锁过程


文字有点多,也可以直接进入图解过程

一、引入问题

单进程jvm下,可以用java内置锁和显示锁来确保线程安全。但是在多jvm下时,如何保证线程安全呢,java层级已经解决不了这个问题。也就是说不同的jvm如何保证资源安全性?引出ZK解决分布式带来的资源同步问题

二、了解ZK

理解节点,为实现分布式锁铺垫。

ZK有四种节点

1、持久节点

默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在。

2、持久节点顺序节点

在创建节点时,zookeeper根据创建的时间顺序给该节点名称进行编号

3、临时节点

和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除

4、临时顺序节点

在创建节点时,zookeeper根据创建的时间顺序给该节点名称进行编号排序(排序的节点形成一个类似队列)。当创建节点的客户端与zookeeper断开连接后,临时节点会被删除(解锁)

三、ZK实现分布式锁过程

这里我以三个不同的客户端client1、client2、client3来演示ZK实现分布式锁的过程。

1、首先,在ZK创建一个持久节点ParentLock。当第一个客户端想要获得锁时,需要在ParentLock这个节点下面创建一个临时顺序的节点(临时节点1),client1查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点1)是不是顺序最靠前的一个。如果是则成功获得锁。执行同步代码块。

2、这个时候,如果再有一个客户端client2(可以理解成不同的进程)前来获取锁,则ParentLock下再创建一个临时顺序节点(临时节点2)。client2查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点2)是不是顺序最靠前的一个,发现不是最小,于是,client2向前排序仅比它靠前的节点注册Watcher,用来监听--临时节点1是否存在。这意味着client2抢锁失败。

3、这个时候,又有一个客户端client3前来获取锁,则ParentLock下再创建一个临时顺序节点(临时节点3)。client3查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点3)是不是顺序最靠前的一个,发现不是最小,于是,client3向前排序仅比它靠前的节点注册Watcher,用来监听--临时节点2是否存在。这意味着client3抢锁失败。

4、客户端client1执行完同步代码块,断开与zookeeper连接,对应的临时节点1也会被删除,解锁成功。此时client2监听到临时节点1不存在,于是拿到锁。执行同步代码块。

5、客户端client2执行完同步代码块,断开与zookeeper连接,对应的临时节点2也会被删除,解锁成功。此时client3监听到临时节点2不存在,于是拿到锁。执行同步代码块。

6、客户端client3执行完同步代码块,断开与zookeeper连接,对应的临时节点3也会被删除,解锁成功

四、图解ZK实现分布式锁过程

1、client1拿锁解释过程,不涉及分布式锁

2、这里我以三个不同的客户端client1、client2、client3来演示ZK实现分布式锁的过程。

1.client1拿锁,创建临时节点1并排序,临时节点1在第一位,成功拿锁==执行同步代码块

2.client2拿锁,创建临时节点2并排序,临时节点2不在第一位,创建监听器监听前面一个临时节点1,拿锁失败==监听中

3.client3拿锁,创建临时节点3并排序,临时节点3不在第一位,创建监听器监听前面一个临时节点2,拿锁失败==监听中。

此时client2也在监听着临时节点1

4.client1同步代码执行完毕断开与zookeeper连接,删除临时节点1,相当于释放锁。

client2一直监听着临时节点1,发现其不存在,拿锁成功==执行同步代码块

client3继续监听

5.client2同步代码执行完毕断开与zookeeper连接,删除临时节点2,相当于释放锁。

client3一直监听着临时节点2,发现其不存在,拿锁成功==执行同步代码块

6.client3同步代码执行完毕断开与zookeeper连接,删除临时节点3,相当于释放锁。

ZK实现分布式锁原理相关推荐

  1. api 创建zookeeper客户端_zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  2. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  3. Apache Curator之分布式锁原理(二)

    本文主要讲解如下内容: 为什么要使用分布式锁? 分布式锁特性! 分布式锁的实现方式有哪些? Curator分布式锁原理 Curator分布式锁实现类UML及相关类的介绍 基于Redis,数据库实现分布 ...

  4. zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  5. ZK实现分布式锁的记录

    实现分布式锁有很多种方式: 1:数据库方式: 谁先插入数据库值成功, 谁就获取锁. 2: 缓存方式 3: zookeeper 实现分布式锁, 推荐这种方式 zk实现分布式锁的原理及流程: 临时节点 + ...

  6. Redisson实现分布式锁原理

    Redisson实现分布式锁原理 一.高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设计分布式锁,这里我认为以下几点是必须要考虑的. 1.互斥 ...

  7. Redis分布式锁原理

    业务背景: 后台定时任务刷新Redis的数据到数据库中,有多台机器开启了此定时同步的任务,但是需要其中一台工作,其他的作为备用,提高可用性.使用Redis分布式锁进行限制,拿到锁的机器去执行具体业务, ...

  8. Redission 分布式锁原理

    Reddission 分布式锁原理 总结: 使用无参的tryLock()方法时,redisson会自动添加一个定时任务,定时刷新锁的失效时间,如果unlock时失败,则会出现该锁一直不释放的情况, 因 ...

  9. Zookeeper分布式锁原理

    1.分布式锁介绍 单机应用开发,涉及并发同步的时候,我们往往采用synchronized 或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 但当我 ...

最新文章

  1. XCODE 6.1.1 配置GLFW
  2. Python list排序
  3. header中的参数讲解
  4. Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本
  5. menuconfig和Kconfig、.config的关系
  6. Spring bean注入方式
  7. DOTween的Sequence图例说明
  8. js页面跳转 和 js打开新窗口 方法 【转】
  9. 基于java springboot vue elementui购物商城源码(毕设)
  10. QQ微云图标升级方法 空间免费扩容攻略
  11. 5v2.1a给5v2a充电行吗
  12. python在线评测系统_关于开源OJ_在线评测系统(Online Judge)设计与实现的研究与分析...
  13. Mycat和MySQL的区别——Mycat的核心作用
  14. java的接口简单使用---interface
  15. rx6800m是什么级别显卡 RX6800m显卡什么水平
  16. 年会互动游戏大全:年会简单又好玩的h5互动游戏盘点
  17. c语言实训自我总结报告日记,C语言学习日记(1)-准备好工具
  18. 数理逻辑——PC部分
  19. 汇报开题PPT模板网站
  20. .net应该学什么怎么学---初学者必看

热门文章

  1. 达人评测酷睿i5 12490f和锐龙r5 5600x 选哪个好 i512490f和r55600x对比
  2. Java中用Ehcache做缓存处理
  3. html使用vue组件
  4. 【高通SDM660平台 Android 10.0】(12) --- Camera Chromatix 代码分析
  5. 【天光学术】英语论文:跨文化交际背景下英汉语模糊数字使用对比(节选)
  6. 通过sendmail服务器配置域外转发到qq邮箱
  7. Unity编辑器打开之后全黑问题
  8. android p 荣耀v10,荣耀V10 P 版本(EMUI 9.0+Android 9.0) 正式版 9.0.0.125 发布说明
  9. 吃鸡不显示服务器,吃鸡四排不显示服务器 | 手游网游页游攻略大全
  10. aloha_与云共享Aloha精神