Java分布式篇一篇文章搞明白分布式锁

本文详细梳理了Java分布式锁的实现,包括悲观锁和乐观锁。悲观锁通过数据库的`select for update`确保原子性,适合写多读少的场景;乐观锁则在数据写入时检查冲突,适用于读多写少的情况,可通过数据库版本字段或CAS机制实现。文中列举了多个实例来解释如何利用数据库和缓存(如Redis)来实现分布式锁。
摘要由CSDN通过智能技术生成

前言

以前一直用redis作为分布式锁的实现,也知道zookeeper可以实现,但是对于分布式锁没有系统梳理,忽略了数据库作为分布式锁的重要应用,本文主要梳理分布式锁实现的主要思路:

按照加锁位置,分为在应用层,缓存层,数据库层加锁

按照加锁的类型,分为乐观锁和悲观锁

悲观锁

顾名思义,悲观锁在修改整个过程中保持对修改数据的加锁,一直到修改结束,防止其它线程或者进程对数据修改。

悲观锁适用于写多读少的情况下,技术实现上依赖数据库的锁机制实现,保证最大程度的独占性。

常用select for update,进行加锁,并且取消事务的自动提交,在修改之后其它事务请求才可以修改数据,其间,select from只读操作是可以进行的。

乐观锁

分为三个阶段:数据读取、写入校验、数据写入。

假设数据一般情况下不会造成冲突,只有在数据进行提交更新时,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回错误信息,让用户决定如何去做。fail-fast机制

乐观锁在适用于读多写少的情况下,常用的实现技术包括

利用数据库锁机制实现

利用数据库实现的核心思想是数据读取,校验,写入放入数据库事务当中进行,如果分开,就存在并发操作问题。

例子1:

假如有个10个线程,每个线程执行10次,每次对sum加1操作(初始值为0&#

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值