目录

  • JAVA的锁
  • 死锁
  • 分布式锁
  • CP模型的分布式锁
  • zk分布式锁的原理
  • zk节点操作
  • zk分布式锁代码实现
  • CP模式分布式锁总结

JAVA的锁

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在线程级别中我们可以通过代码的方式来实现锁的功能,例如Lock接口和synchronized关键字,在并发场景中充斥这大量的锁问题(线程锁、数据库锁、进程锁)。

死锁

所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
java 死锁产生的四个必要条件:

  • 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

PS:死锁的概念是百度抄的,轻喷

分布式锁

在以前的开发中,我们是把所有的代码部署在一台服务器中,只有一个jvm虚拟机,所有的请求都是线程级别的,因此我们只需要通过java的锁即可实现线程安全。
在现在的分布式场景下,我们是将一个系统或者是一个功能模块部署在多台服务器中,即一个服务有多个节点。一个请求访问你的系统时,我们的Nginx或者网关会把请求分发给不同的节点中,这时候如果有共享的资源就会出现竞争问题(线程不安全),此时jvm的线程锁无法解决进程间的资源竞争问题,这样分布式锁就出现了。

CP模型的分布式锁

CP模型是保证了在分布式系统中的一致性。CP模型的分布式锁是基于zk或者Etcd来实现的,适用于需要保证数据一致性的场景中。无论是zk还是Etcd本身就是支持分布式场景的组件,在集群有相互同步数据的机制,选择CP模式的分布式锁会牺牲一些系统的性能来保证数据的一致性,CP模式的分布式锁会在主宕机的情况下变的不可用(需要重新选主),即无法保证可用性。

zk分布式锁的原理

zk的分布式锁实现主要是基于zk的节点。zk的节点一共是分为持久节点(PERSISTENT),持久顺序节点(PERSISTENT_SEQUENTIAL),临时节点(EPHEMERAL),临时顺序节点(EPHEMERAL_SEQUENTIAL)四种。持久节点的特点是节点创建之后会一直存在,用户不做删除操作节点不会消失。临时节点的特点是节点会与客户端的会话绑定,客户端的会话结束节点会自动消失。因此zk的分布式锁是基于zk的临时顺序节点来实现。当多个进程访问我们的共享资源时,会先在zk上创建一个临时的顺序节点,并监听上一个节点,在进入业务代码前判断当前创建的节点是否为最小值,如果是最小值则才能做后续的操作,否则不做操作,继续等待。

zk节点操作


创建持久节点:
create /path value
创建顺序持久节点:
create -s /path value
创建临时节点:
create -e /path value
创建顺序临时节点:
create -e -s /path value

zk分布式锁代码实现



代码比较简单做了一个切面,用的是一个zk的jar包中实现的zk锁。如下:

CP模式分布式锁总结

以上是我对zk实现的分布式锁的一些介绍。zk可以很好的保证数据的一直性,不会因为节点宕机而导致数据的丢失,在对数据一致性要求较高的场景中使用即可。但是zk并不是一个专门来做存储的组件,在正式的生产环境中多数是扮演了一个注册中心的角色,是整个系统的协调者,如果让zk来承担较多的数据存储从而实现分布式锁并不是一个很好的方案,因此大多数情况下我们会用Etcd来实现CP模式的分布式锁,Etcd的CAS机制对于分布式锁的存储更友好,后续再写一篇Etcd的分布式锁吧,如有不足望大家指正。

CP模式(ZK)的分布式锁分析相关推荐

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

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

  2. ZK实现分布式锁原理

    目录 一.引入问题 二.了解ZK 三.ZK实现分布式锁过程 四.图解ZK实现分布式锁过程 文字有点多,也可以直接进入图解过程 一.引入问题 单进程jvm下,可以用java内置锁和显示锁来确保线程安全. ...

  3. 多级缓存分析篇(二) 常用分布式锁分析

    上篇主要讲了日常经常使用的哪些redis包及其配置的差异,这篇对基于redis的分布式锁,主要分享下自定义锁和redisson锁的使用和分析. 1.(自定义)Redis分布式锁 对于redis来说,非 ...

  4. Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )

    文章目录 什么是分布式锁 分布式死锁 分类 排他锁 共享锁 实现 创建锁 获取锁 释放锁 Demo Jmeter配置 方案零 缺陷版本 方案一 非公平锁方案 缺陷 (羊群效应) 方案二 公平锁方案 方 ...

  5. redis和zk实现分布式锁的优缺点

    Redis实现 优点:性能好 缺点: 对某个 redismaster 实例,写入了 myLock 这种锁 key 的 value,此时会异步复制给对应的 masterslave 实例. 但是这个过程中 ...

  6. 三、基于ZK实现分布式锁

    一.分布式锁介绍 分布式锁主要用于在分布式环境中保护跨进程.跨主机.跨网络的共享资源实现互斥访问,以达到保证数据的一致性. 二.架构介绍 在介绍使用Zookeeper实现分布式锁之前,首先看当前的系统 ...

  7. Redisson分布式锁分析

    2019独角兽企业重金招聘Python工程师标准>>> RedissonLock继承结构: RLock接口中定义的方法:主要分析tryLock()实现. **(一) Redisson ...

  8. redis分布式锁与zk分布式锁的对比

    在分布式环境下,传统的jvm级别的锁会失效,那么分布式锁就是非常有必要的一个技术,一般我们可以通过redis,zk等技术来实现我们的分布式锁 redis实现分布式锁: 原理:我们都知道redis的处理 ...

  9. 分布式锁是啥?zk还是redis?

    关于分布式系统中应该考虑的几个问题包括诸如最基本的分布式锁和分布式事务等.该篇中我们将简单来聊聊分布式锁相关知识,比如常见的分布式锁的实现方式有哪些?redis如何设计分布式锁?zk如何设计分布式锁? ...

最新文章

  1. javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
  2. 海峡两岸消防专家论坛台湾举行
  3. numpy数组如何将数组中的元素批量保留小数(或精确到指定位)?np.around()函数(与np.round()函数等价?)
  4. XBMC 最新版本错误
  5. leetcode-728-Self Dividing Numbers
  6. ACM_逆序数(归并排序)
  7. reset.css页面样式初始化
  8. Java Date Nuances的痛苦提醒
  9. 利用qsort二级排序
  10. abap 取日期最大_Pointer干货分享:SQL面试50题思路解答与分类整理(下)CASE与日期函数...
  11. NUC1422 字母旋转游戏【水题】
  12. 网页百度云盘服务器有点忙,百度网盘使用提示网络异常,建议使用三种解决方法...
  13. 使用 PotPlayer 搭配 SVP 4 播放60帧电影
  14. chrome浏览器版本和driver版本对照表
  15. 1168: mxh对lfx的询问(前缀和+素数表)
  16. python小课风变编程_风变编程Python小课最近很火,大家学完感受如何?
  17. 2021-03-24
  18. Python基础教程--【2022暑假全新总结】
  19. 企业口碑营销如何做好,可运用这5T理论
  20. 启动Mysql时报错:mysqld_safe mysqld from pid file /usr/local/mysql/data/Linux.pid ended

热门文章

  1. 目标检测FCOS网络环境配置、训练自己的数据集
  2. 统计机器翻译 NiuTrans 开源软件
  3. Dairy?Diary!
  4. 控诉猪猪的十大罪状!
  5. 你不可错过的光模块中的激光器类型大盘点!
  6. [科普]嫦娥四号的中继卫星鹊桥,所处的拉格朗日L2点是什么?
  7. android8快图浏览,快图浏览 QuickPic Gallery v8.0.2
  8. 使用reveal.js写演示文稿
  9. 从组织到个人的提效建设
  10. bioconda中国镜像(北外备用,清华已恢复,中科大暂时没恢复)