分布式锁——理论篇

1、什么是分布式锁

       分布式锁是什么呢?当然是一种锁了,只不过是在分布式系统中使用的锁。在分布式系统中,为了防止分布式系统中的多个进程之间相互干扰,保证一个方法或属性在高并发情况下的同一时刻只能被同一个线程执行和使用,就需要一种分布式协调技术来对这些进程进行控制和调度。而分布式锁就是能够实现分布式协调调度的技术。

 

2、为什么使用分布式锁

       在单机环境中Java提供了很多并发处理相关的API。比如在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。

       可以参考下图案例进行理解。在单机应用中,所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理,而这个共享变量只是在这个JVM内部的一块内存空间。随着业务的发展需要做集群部署,一个应用需要部署到几台机器上然后做负载均衡,大致如下图:

  • 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中
  • 成员变量 A 同时都会在 JVM 分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的
  • 不是同时发过来,三个请求分别操作三个不同 JVM 内存区域的数据,变量 A 之间不存在共享,也不具有可见性,处理的结果也是不对的
    注:该成员变量 A 是一个有状态的对象

       为了解决这个问题,就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。

3、分布式锁的特点

       (1)在分布式系统环境下,一个方法或者属性在同一时刻只能被一个机器的一个线程执行或者访问,这是分布式锁的出现要解决的问题。 
       (2) 高可用的获取锁与释放锁; 
       (3)高性能的获取锁与释放锁; 
       (4)具备可重入特性; 
       (5)具备锁失效机制,防止死锁; 
       (6)具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

4、分布式锁的几种实现方式

       目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。针对分布式锁的实现,目前比较常用的有以下几种方案:基于数据库实现分布式锁、基于缓存实现分布式锁、基于Zookeeper实现分布式锁

(1)基于数据库实现分布式锁 

重新写个博文:https://blog.csdn.net/wangqsse/article/details/106967825

(2)基于缓存Redis实现分布式锁

        I、基于redis分布式锁:https://blog.csdn.net/wangqsse/article/details/106968756

        II、基于redisson的分布式锁:https://www.cnblogs.com/kiko2014551511/p/11527108.htmlhttps://www.cnblogs.com/diegodu/p/8185480.html

(3)基于Zookeeper实现分布式锁:

https://www.cnblogs.com/toov5/p/9899489.html

https://www.cnblogs.com/ysw-go/p/11444993.html

 

参考:

(1)https://blog.csdn.net/wuzhiwei549/article/details/80692278

(2)https://www.cnblogs.com/austinspark-jessylu/p/8043726.html

(3)https://www.jianshu.com/p/a1ebab8ce78a

(4)https://www.cnblogs.com/seesun2012/p/9214653.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值