分布式锁介绍与实现

锁介绍

多核CPU操作内容数据

当CPU进入多核时代后, 操作系统为了更好发挥CPU的性能, 因此出现了多线程操作; 然后CPU为了提高处理速度, 当线程操作数据时是不和系统内存直接进行交互的, 而是使用缓存; 同时CPU的缓存分为一级缓存, 二级缓存, 三街缓存, 每一级缓存中所存储的全部数据都是下一级缓存的一部分, 这三种缓存的技术难度和制造成本是相对递减的, 所以其容量也是递增的; 当CPU要读取一个数据时, 首先从一级缓存中查找, 如果没有找到再从二级缓存中查找, 如果还是没有就从三级缓存, 再没有就到内存中查找。

锁的产生

当多个线程同时并发操作同一份数据时, 比如对一个整数累计加1, 这时如果每个线程都只是操作其CPU核的缓存的话, 就会导致读到失效数据或写入脏数据; 因此我们需要一种同步机制让同一时刻只能有一个线程去操作共享的数据; 应运而生锁就出现了, 即将一个内存共享资源进行锁定, 只允许加锁线程在加锁期间访问此数据; 在Java的世界里, synchronize关键字就是一个简单易用的锁;

分布式锁

分布式环境

分布式系统是建立在网络之上的软件系统, 在这样一个系统中便是所谓的分布式环境; 随着单体服务的性能达到上限, 及稍有规模的业务便会比较复杂, 需要在分布式环境中才能实现自身的功能及提供足够的服务能力;

CAP原则

CAP原则, 指的是在一个分布式系统中一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance), 这三个要素最多只能同时实现两点,不可能三者兼顾。其中,

  • 分区容忍性(P):从实际效果上而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况。
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。但是在分布式网络环境中, P是客观存在的, 所以最终我们可以实践落地的方案要么是AP, 要么就是CP;
CAP
而要在分布式环境下实现分布式锁, 那我们的产品应该是遵循CP模式的, 因为必须保证锁的唯一性;

分布式锁的实现条件

锁资源: 全局唯一, 所有线程、进程都可以访问;
锁状态: 至少包含两个状态(有锁, 无锁)

分布式锁实现的要求
  • 锁的互斥性-(必须): 要确保在某一个时刻只有一个线程能拿到锁, 锁的定义可以为一笔订单, 用户余额, 等;
  • 锁的所属性-(必须): 要保证是谁加的锁, 谁才能解锁, 不能去解别人加的锁;
  • 无死锁-(必须): 当一个线程获取到锁后, 如果该线程意外终止了, 那应该有机制保证它所获得的锁在一定时间内被释放掉;
  • 锁的可重入-(推荐): 有时业务上会出现同一线程重复进入一段加锁代码, 这就要求我们的锁是可重入的;
  • 锁的获取支持阻塞和非阻塞-(推荐): 业务上通常会有阻塞和非阻塞两种获取锁的需求;
  • 锁服务高可用和高性能-(必须): 需要保证无论任何时刻, 客户端都可以正常进行加锁与释放锁的操作, 然后高性能自然是至少要满足业务所需;
分布式锁的多种实现方式
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值