使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)

图文源码解析Java分布式场景下,分布式锁用Redis 还是 Zookeeper?你真的会吗? 图文源码解析Java分布式场景下,分布式锁用Redis 还是 Zookeeper?你真的会吗? 为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。 最新2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spri. 阅读详情

 

一、使用ZooKeeper实现Java跨JVM的分布式锁

二、使用ZooKeeper实现Java跨JVM的分布式锁(优化构思)

三、使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)

 

读写锁:

本文在前面俩片的基础之上介绍如何 使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)。

 

简单介绍一下读写锁,在使用读写锁时, 多个客户端(线程)可以同时获取 “读锁”, 但是“写入锁”是排它的,只能单独获取。

1、假设A,B线程获取到 “读锁”, 这时C线程就不能获取 “写锁”。

2、假设C线程获取了“写锁”,那么A,B线程就不能获取“读锁”。

这在某种情况下会大幅度提高系统的性能,在单JVM进程内 Java已经提供了这种锁的机制,可以参考ReentrantReadWriteLock这个类。

 

基于ZK的分布式读写锁:

本文主要介绍ZK的分布式读写锁,还是基于Curator客户端实现。

 

[java] view plain copy

 

 CODE_ico.pnguploading.4e448015.gif正在上传…重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif正在上传…重新上传取消派生到我的代码片

  1. package com.framework.code.demo.zook.lock;  
  2.   
  3. import org.apache.curator.RetryPolicy;  
  4. import org.apache.curator.framework.CuratorFramework;  
  5. import org.apache.curator.framework.CuratorFrameworkFactory;  
  6. import org.apache.curator.framework.recipes.locks.InterProcessMutex;  
  7. import org.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;  
  8. import org.apache.curator.retry.ExponentialBackoffRetry;  
  9.   
  10. public class ReadWriteLock {  
  11.   
  12.     /** 
  13.      * @param args 
  14.      * @throws Exception  
  15.      */  
  16.     public static void main(String[] args) throws Exception {  
  17.         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);  
  18.         CuratorFramework client = CuratorFrameworkFactory  
  19.                 .newClient("192.168.1.103:2181", retryPolicy);  
  20.         client.start();  
  21.           
  22.         InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/read-write-lock");  
  23.           
  24.         //读锁  
  25.         final InterProcessMutex readLock = readWriteLock.readLock();  
  26.         //写锁  
  27.         final InterProcessMutex writeLock = readWriteLock.writeLock();  
  28.           
  29.         try {  
  30.             readLock.acquire();  
  31.             System.out.println(Thread.currentThread() + "获取到读锁");  
  32.               
  33.             new Thread(new Runnable() {  
  34.                 @Override  
  35.                 public void run() {  
  36.                     try {  
  37.                         //在读锁没释放之前不能读取写锁。  
  38.                         writeLock.acquire();  
  39.                         System.out.println(Thread.currentThread() + "获取到写锁");  
  40.                     } catch (Exception e) {  
  41.                         e.printStackTrace();  
  42.                     } finally {  
  43.                         try {  
  44.                             writeLock.release();  
  45.                         } catch (Exception e) {  
  46.                             e.printStackTrace();  
  47.                         }  
  48.                     }  
  49.                 }  
  50.             }).start();  
  51.             //停顿3000毫秒不释放锁,这时其它线程可以获取读锁,却不能获取写锁。  
  52.             Thread.sleep(3000);  
  53.         } catch (Exception e) {  
  54.             e.printStackTrace();  
  55.         } finally {  
  56.             readLock.release();  
  57.         }  
  58.           
  59.         Thread.sleep(1000000);  
  60.         client.close();  
  61.     }  
  62.   
  63. }  


 

 

实现原理:

实现原理与之前介绍的锁的原理基本类似,这里主要说明一下不同之处。

1、写入锁在申请锁时写入的节点名称是这样的   xxxx-__WRIT__00000000xxx 例如:   _c_9b6e456b-94fe-47e7-b968-34027c094b7d-__WRIT__0000000006

2、读取锁在申请锁时写入的节点名称是这样的  xxxx-__READ__00000000xxx 例如:    _c_9b6e456b90-9c33-6294665cf525--b6448-__READ__0000000005

区别就是写入锁的字符串包含WRIT,读取所包含READ

 

获取锁的区别:

1、写入锁在获取锁时的处理与前面文章介绍的原理一直,就是判断自己前面还有没有节点,如果没有就可以获取到锁,如果有就等待前面的节点释放锁。

2、读取锁在获取锁时的处理是,判断自己前面还有没有写入锁的节点,也就是前面的节点是否包含WRIT,如果有那么等待前面的节点释放锁。

读取所自己前面有 其它 读取锁节点 无所谓,它仍然可以获取到锁,这也就是读取所可以多客户端共享的原因。

 

MATLAB实战:用ARMAX模型搞定电力系统惯量实时评估(附完整代码) 本文详细介绍了如何利用MATLAB中的ARMAX模型实现电力系统惯量的实时评估。通过系统辨识技术,结合电力系统的动态特性,提供从数据预处理、模型辨识到实时评估的全流程实战指南,并附完整代码。ARMAX模型在新能源高渗透率电网中展现出显著优势,误差较传统方法降低50%以上。 阅读详情

相关推荐

COLMAP生成MVSNet数据集

COLMAP生成MVSNet数据集

qq_43307074的博客 5638

JVM虚拟机原理深入解析,Zookeeper一致性级别分析

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)Java面试精选题、架构实战文档你的支持,我的动力;祝各位前程似锦,offer不断!现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

m0_60635176的博客 1012

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

Java中如何实现一个“读写锁“呢?

java实现可重入锁的示例分享

qq_25073223的博客 1211

InfiniBand(IB)实战指南:从硬件配置到性能优化

本文是一份详尽的InfiniBand实战指南,涵盖从硬件选型、部署到驱动配置、性能优化的全流程。重点解析了InfiniBand作为AI训练与高性能计算(HPC)核心网络的优势,特别是其支持的RDMA技术如何实现微秒级低延迟。文章提供了硬件匹配、NCCL压测、内核参数调优及在PyTorch分布式训练中启用IB的实操步骤,旨在帮助工程师构建和优化高性能计算集群。

mqtt6iot的博客 582

SAP中贸易伙伴的应用原理简析

公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 9817

zookeeper 监控 与 JVM 设置

zookeeper 监控 jvm 监控 prometheus监控

qq_41768644的博客 1448

2024银行科技岗笔试通关秘籍:从资料准备到实战技巧

本文系统解析了2024年银行科技岗笔试的考察内容与备考策略。文章指出,笔试是一场涵盖通用能力测试、计算机专业基础、金融科技知识和英语性格测试的复合型考试,并重点提供了数据结构与算法、计算机网络、数据库等高频考点的深度解析与实战突破技巧,帮助考生高效准备,顺利通关。

weixin_29243279的博客 122

zookeeper版本选择与配置参数调优

Apache ZooKeeper 如何选择,以及相关配置优化

这个人很懒。 1万+

Unity 横版游戏开发天花板?状态机、联机同步与横版动作游戏架构全都有

在 Unity 横版动作游戏开发领域,最耗时间的往往不是角色移动,而是整套“可扩展架构”的搭建。包括角色状态管理、敌人 AI、武器系统、关卡编辑器、联机同步、输入适配、UI 与存档系统等。2D Action Platformer Kit 的核心价值,并不只是“提供素材”,而是它已经帮开发者搭好了一整套适用于横版动作游戏的底层框架。

2403_88403568的博客 425

ICC2: place阶段的clock network delay

设置了set_clock_latency之后,即便没长tree,也会有反标值,显示为clock network delay(ideal)和设置的clock latency值,需要注意的是同时设置set_clock_latency和set_clock_latency -source,clock network delay(ideal)值是二者叠加的。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 317

ZooKeeper: 简介, 配置及运维指南

1. 概览 ZooKeeper是一个供其它分布式应用程序使用的软件, 它为其它分布式应用程序提供所谓的协调服务. 所谓的协调服务, 是指ZooKeeper的如下能力 naming 命名 configuration management 配置管理 synchronization 同步 group service 分组服务 上面四个功能可能现在不太好说清, 但大致上目前你需要明白ZooKeeper...

weixin_30448603的博客 1794

详解AUTOSAR:AUTOSAR架构中的配置文件(拓展篇—7)

查看AUTOSAR代码包时会发现一些这样格式的文件:xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h,本篇博文讲一讲这几个配置文件的作用和特点。

不脱发的程序猿 2148

zookeeper java 锁_使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)

读写锁:本文在前面俩片的基础之上介绍如何使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)。简单介绍一下读写锁,在使用读写锁时, 多个客户端(线程)可以同时获取 “读锁”, 但是“写入锁”是排它的,只能单独获取。1、假设A,B线程获取到 “读锁”, 这时C线程就不能获取 “写锁”。2、假设C线程获取了“写锁”,那么A,B线程就不能获取“读锁”。这在某种情况下会大幅度提高系统的性能,在...

weixin_39996096的博客 86

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 集群锁_使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)

读写锁:本文在前面俩片的基础之上介绍如何使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)。简单介绍一下读写锁,在使用读写锁时, 多个客户端(线程)可以同时获取 “读锁”, 但是“写入锁”是排它的,只能单独获取。1、假设A,B线程获取到 “读锁”, 这时C线程就不能获取 “写锁”。2、假设C线程获取了“写锁”,那么A,B线程就不能获取“读锁”。这在某种情况下会大幅度提高系统的性能,在...

weixin_33439618的博客 201

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Zookeeper(curator)实现分布式锁案例

Zookeeper下载安装、Zookeeper常用命令、zookeeper实现分布式锁案例、curator实现分布式案例、zookeeper实现分布式锁思想

健身变秃,coding变强 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

关于分布式锁的面试题都在这里了|Reids分布式锁|ZooKeeper分布式锁

我今天班儿都没上,就为了赶紧把这篇文章分布式锁早点写完。我真的不能再贴心了。 边喝茶边构思,你们可不要白嫖了! 三连来一遍? 引言 为什么要学习分布式锁? 最简单的理由就是作为一个社招程序员,面试的时候一定被面啦,你看怎么多公众号都翻来覆去的发分布式锁的主题,可见它很重要啦,在高考里这就是送分题,不要怪可惜的。 那应届生也会问吗?这就不一定了,但是,如果你会,面试官肯定会多给你那点分(钱) 第三...

6027

使用ZooKeeper实现Java跨JVM的分布式锁

说明:本文是使用Curator框架进行讲解及演示,Curator是对Zookeeper客户端的一个封装,因为Zookeeper的客户端实现偏底层,如果想要实现锁或其他功能都需要自己封装,实现一些简单的功能还可以,如果想要实现锁这种高并发下的东西,不建议自己封装,除非你自信你写的东西比国外大神写的还好~ 如果是研究学习到是可以自己写一下,同时也可以看看开源的代码,那里面还是有很多值得学习的东西。

大新博客 9733

使用ZooKeeper实现Java跨JVM的分布式锁(优化构思)

说明:这篇文章是基于 使用ZooKeeper实现Java跨JVM的分布式锁 的,没有阅读的朋友请先阅读前面的文章后在阅读本文。 上一篇文章中介绍了如何使用分布式锁,并且对原来的公平锁进行了扩展,实现了非公平锁,已经能够满足大部分跨进程(JVM)锁的需求了。 问题:我们都知道在单个JVM内部实现锁的机制很方便,Java也提供了很丰富的API可以实现,例如Synchronized关键字,

大新博客 1万+

ZooKeeper 实现分布式锁

在分布式系统中,为了保证共享资源在并发访问下的数据一致性,需要引入分布式锁。分布式锁是一种在分布式环境下控制多个进程对共享资源进行互斥访问的机制。它与单机环境下的锁(如Java中的或Lock)不同,单机锁只能解决同一JVM内部的并发问题,而分布式锁则需要解决跨JVM、跨机器的并发问题。ZooKeeper作为一款优秀的分布式协调服务,为分布式锁的实现提供了可靠的基础。通过其临时顺序节点和Watcher机制,可以构建出高可用、可靠且公平的分布式锁。

weixin_56018532的博客 1561

Redis 实现分布式锁和Zookeeper实现分布式锁

使用 Redis 实现分布式锁 在 JUC 包中除了阻塞锁外还有一种叫 CAS 的无阻塞锁(具体可以参考:Java 并发编程之美:并发编程基础晋级篇),CAS 操作本身是原子性的,多个线程操作同一个变量的 CAS 时候只有一个线程能进行 CAS 成功,失败的线程接下来那么使用乐观锁机制直接失败要么使用自旋方式使用 CPU 资源重复进行 CAS 尝试。 那么在分布式锁的实现中我们也可以使用类似的方式...

努力奔跑 2万+

Java面试-分布式锁的实现方式:Redis、ZooKeeper、数据库

《Java分布式锁实战:Redis、ZooKeeper与数据库对比》摘要: 本文系统解析分布式锁三大实现方案:1)Redis锁基于SETNX原子操作,推荐使用Redisson解决自动续期与主从问题;2)ZooKeeper锁依赖临时顺序节点实现强一致性,需注意性能开销;3)数据库锁通过唯一索引或SELECT FOR UPDATE保证互斥,适合简单场景。文章对比了三者优缺点,提供Java代码示例,并针对秒杀等典型场景给出选型建议,最后附上面试高频问题集,帮助开发者掌握分布式锁核心原理与实践技巧。(149字)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

基于Zookeeper实现分布式锁

收到

weixin_43949634的博客 1033

zookeeper实现分布式锁

介绍了Zookeeper如何实现分布式锁,并使用代码进行了演示

凉茶铺的博客 6972
上一篇: zookeeper分布式锁原理
下一篇: rediscluster
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值