实现原理:利用zookeeper的持久性节点和Watcher机制

具体步骤:

  1、创建持久性节点 zkLock

  2、在此父节点下创建子节点列表,name按顺序定义

  3、Java程序获取该节点下的所有顺序子节点,并且按照从小到大的顺序排列

  4、取出最小的节点,如果该节点在所有顺序子节点列表中index等于0,代表成功获取到锁资源

    否则将给比当前节点还小的节点注册监听事件,利用Watcher机制动态观察节点的删除事件

  5、删除子节点即释放锁资源

具体细节可参考园友文章:https://blog.csdn.net/sunfeizhi/article/details/51926396

我模拟了多用户抢购下单的业务场景,从无锁到本地锁再到分布式锁做了一个分析,首先

1、无锁场景

2、本地锁场景

3、基于zookeeper建立分布式锁

模拟真实场景后,对什么时候该用锁的了解更清晰了一步,实际上非大型公司不一定要使用zookeeper来实现,只是我最近研究zookeeper底层原理时,注意到了zookeeper的主动通知特性,在建立节点时也会存储消费者的信息,对可重入机制、智能锁支持良好,这一点是eureka没有的

一般来说选择自己团队最合适的才是正确的,下一次我将使用redis来实现分布式锁,此方案综合考虑(团队技术人员整体水平)是非常适合的一种方案,虽然redis没有主动通知,但可以利用key的过期时间来实现

期间遇到的问题是对线程池底层原理掌握不充足,闹了个乌龙,在这个地方纠结了二十多分钟

我最初好奇为什么线程没有自动退出,检查代码也没有错误的地方,最后突然想起来我使用线程池来管理的线程,线程池核心概念即重用线程,所以当线程使用之后会归还给线程池,下次使用时从缓存中拿线程,这个地方我还是要好好记一记

阅读源代码请访问https://github.com/wade-zh/zkLocker

基于zookeeper实现高性能分布式锁的更多相关文章

  1. 基于zookeeper实现的分布式锁

    基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...

  2. 基于Zookeeper实现多进程分布式锁

    一.zookeeper简介及基本操作 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化.当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watc ...

  3. 基于zookeeper简单实现分布式锁

    https://blog.csdn.net/desilting/article/details/41280869 这里利用zookeeper的EPHEMERAL_SEQUENTIAL类型节点及watc ...

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

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

  5. 基于数据库、redis和zookeeper实现的分布式锁

    基于数据库 基于数据库(MySQL)的方案,一般分为3类:基于表记录.乐观锁和悲观锁 基于表记录 用表主键或表字段加唯一性索引便可实现,如下: CREATE TABLE `database_lock` ...

  6. java使用zookeeper实现的分布式锁示例

    java使用zookeeper实现的分布式锁示例 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-07我要评论 这篇文章主要介绍了java使用zookeeper实现的分布式锁示例,需要 ...

  7. 基于redis实现的分布式锁

    基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...

  8. 高性能分布式锁-redisson

    RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...

  9. 如何用Zookeeper来实现分布式锁?

    什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...

随机推荐

  1. python下载指定页面的所有图片

    实现步骤: 1.下载页面源码 2.对页面进行解析,获取页面中所有的图片路径 3.下载图片到指定路径 代码实例: # coding: utf-8 import urllib2 # 该模块用于打开页面地址 ...

  2. python学习(四) 字典:当索引不好用时

    第四章 字典:当索引不好用时 4.1 字典的使用 字典的适用场景: 表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组: 存储文件修改时间,用文件名作为键: 数字电话/地址簿 4.2 创建和使用字典 ...

  3. nandflash裸机程序分析

    它包含7个文件: head.S init.c main.c Makefile nand.c nand.lds 我们之前的程序都是在nandflash的前4k放代码,上电后自动拷贝到SRAM中,之后将S ...

  4. List和Map常用的几种遍历方式

    遍历一个List有以下几种方法: /*//1.普通for循环的方式: List<String> list=new ArrayList<String>(); list.add(& ...

  5. flask系列六之模型分文件

    1.分开models的目的:为了让代码更加方便的管理. 2.如何解决循环引用:把db放在一个单独的文件中,切断循环引用的线条就可以了. (1)避免循环引用 解决循环引用 主文件:main.py fro ...

  6. leetcode605

    public class Solution { public bool CanPlaceFlowers(int[] flowerbed, int n) { && flowerbed[] ...

  7. MSDE2000

    安装MSDE2000的时候,遇到的两个问题 sqlserver 小版本 SQL安装问题.系统说:为了安全,要求使用SA密码,请使用SAPWD开关提供同一密码

  8. linux的netstat命令详解

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...

  9. Monthly Expense(二分--最小化最大值)

    Farmer John is an astounding accounting wizard and has realized he might run out of money to run the ...

  10. js控制图片放大缩小的简易版

    js代码: function bb_img_onmousewheel(e, o) { var zoom = parseInt(o.style.zoom, 10) || 100; zoom += eve ...