分布式锁是控制分布式系统之间同步访问共享资源的一种方式。

下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁。

排他锁

排他锁(Exclusive Locks),又被称为写锁或独占锁,如果事务T1对数据对象O1加上排他锁,那么整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能进行读或写。

定义锁:

/exclusive_lock/lock

实现方式:

利用 zookeeper 的同级节点的唯一性特性,在需要获取排他锁时,所有的客户端试图通过调用 create() 接口,在 /exclusive_lock 节点下创建临时子节点 /exclusive_lock/lock,最终只有一个客户端能创建成功,那么此客户端就获得了分布式锁。同时,所有没有获取到锁的客户端可以在 /exclusive_lock 节点上注册一个子节点变更的 watcher 监听事件,以便重新争取获得锁。

共享锁

共享锁(Shared Locks),又称读锁。如果事务T1对数据对象O1加上了共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都释放。

定义锁:

/shared_lock/[hostname]-请求类型W/R-序号

实现方式:

1、客户端调用 create 方法创建类似定义锁方式的临时顺序节点。

2、客户端调用 getChildren 接口来获取所有已创建的子节点列表。

3、判断是否获得锁,对于读请求如果所有比自己小的子节点都是读请求或者没有比自己序号小的子节点,表明已经成功获取共享锁,同时开始执行度逻辑。对于写请求,如果自己不是序号最小的子节点,那么就进入等待。

4、如果没有获取到共享锁,读请求向比自己序号小的最后一个写请求节点注册 watcher 监听,写请求向比自己序号小的最后一个节点注册watcher 监听。

实际开发过程中,可以 curator 工具包封装的API帮助我们实现分布式锁。

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>x.x.x</version>
</dependency>

curator 的几种锁方案 :

  • 1、InterProcessMutex:分布式可重入排它锁
  • 2、InterProcessSemaphoreMutex:分布式排它锁
  • 3、InterProcessReadWriteLock:分布式读写锁

下面例子模拟 50 个线程使用重入排它锁 InterProcessMutex 同时争抢锁:

实例

public class InterprocessLock {public static void main(String[] args)  {CuratorFramework zkClient = getZkClient();String lockPath = "/lock";InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath);//模拟50个线程抢锁for (int i = 0; i < 50; i++) {new Thread(new TestThread(i, lock)).start();}}static class TestThread implements Runnable {private Integer threadFlag;private InterProcessMutex lock;public TestThread(Integer threadFlag, InterProcessMutex lock) {this.threadFlag = threadFlag;this.lock = lock;}@Overridepublic void run() {try {lock.acquire();System.out.println("第"+threadFlag+"线程获取到了锁");//等到1秒后释放锁Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}finally {try {lock.release();} catch (Exception e) {e.printStackTrace();}}}}private static CuratorFramework getZkClient() {String zkServerAddress = "192.168.3.39:2181";ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);CuratorFramework zkClient = CuratorFrameworkFactory.builder().connectString(zkServerAddress).sessionTimeoutMs(5000).connectionTimeoutMs(5000).retryPolicy(retryPolicy).build();zkClient.start();return zkClient;}
}

控制台每间隔一秒钟输出一条记录:

SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 电商之14.0 Zookeeper 分布式锁实现原理相关推荐

  1. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之责任链模式

    责任链模式 推荐分布式微服务电商源码 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收 ...

  2. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之策略模式

    策略模式 推荐分布式微服务电商源码 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象 ...

  3. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之适配器模式

    适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的 ...

  4. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Git 远程仓库(Github)

    Git 远程仓库(Github) 推荐电商源码 Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. ...

  5. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Maven教程

    Maven 教程 推荐电商源码 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概 ...

  6. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Docker 架构

    Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统.比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16 ...

  7. JAVA版商城 B2B2C商城 多商家商城 直播带货商城 短视频带 货商城 新零售商城 o2o商城 拼团商城 分销商城 直播商城 springcloud商城 spring cloud商城 积分商城

    1. 涉及平台 平台管理.商家端(PC端.手机端).买家平台(H5/公众号.小程序.APP端(IOS/Android).微服务平台(业务服务.系统服务.中间件服务) 2. 核心架构 Spring Cl ...

  8. springboot 定时器_基于SpringCloud?+?SpringBoot的 SaaS型微服务脚手架源码分享

    简介: 基于SpringCloud(Hoxton.SR3) + SpringBoot(2.2.6.RELEASE) 的 SaaS型微服务脚手架,具备用户管理.资源权限管理.网关统一鉴权.Xss防跨站攻 ...

  9. java版SpringCloud+SpringBoot+mybatis+uniapp b2b2c 多商户入驻商城 直播商城 直播带货商城之行业管理

    1. 涉及平台 平台管理.商家端(PC端.手机端).买家平台(H5/公众号.小程序.APP端(IOS/Android).微服务平台(业务服务) 2. 核心架构 Spring Cloud.Spring ...

最新文章

  1. 如何用git连接mysql_phpstorm神器之连接使用GitMySQL
  2. python_day9 进程池
  3. 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解...
  4. boost::posix_time模块打印当天的剩余小时数的测试程序
  5. paip.mysql 5.6 安装总结
  6. 安全地创建和存储密码
  7. threejs基础示例
  8. 3.3设计自己的线程局部存储
  9. python类的构造方法名称_Python的面向对象、Class 概念与使用
  10. Android布局详解(二)
  11. 输出流创建txt文件
  12. 如何提高工作效率,提高工作效率的方法?
  13. 软件测试工程师笔试题目
  14. 语音预处理之分帧加窗
  15. Web前端 色彩设计指南
  16. UDF函数:对字符串实现sha256加密,返回64位十六进制字符串
  17. 九连环解法和小程序。
  18. 【Android Jetpack】Room——基本使用篇
  19. 计算机表格用计算公式百分百,excel表格怎么算数据的阳性比率-计算机一级用excel表格计算增长比例该怎么算?...
  20. 网络环路原理及其影响

热门文章

  1. python3抓取杭州房价信息
  2. 如何看iPhone是哪个国家的
  3. (三十 :2021.01.11)MICCAI 2018 追踪之论文纲要(上)
  4. vue附件上传和展示
  5. elasticsearch地理位置查询
  6. 如何使用HTTPS加密保护网站?
  7. 华为ensp配置aaa认证
  8. 《唐伯虎点秋香》中的超级对联
  9. FireFox与IE中CSS兼容技术集绵整理
  10. WORD文档类型跟WORD97-2003文档类型有什么不同