基于mysql实现分布式序列id_基于 MySQL 的分布式乐观锁:ID 生成器

1. 多线程并发安全

Java 是多线程的,但多线程是一把双刃剑,一旦涉及到多线程共享资源的情况时,如果处理不当,就有可能出现线程安全问题,从而导致系统的失败。

Java 多线程并发安全的解决方案很多,其中通过锁来保障并发安全是比较常用的方案之一。

2. 悲观锁 VS 乐观锁

悲观锁和乐观锁为实现 Java 多线程并发安全的主要策略,但两者的出发点和设计思路完全不同。

2.1. 悲观锁

事前审核。它具有强烈的独占性和排它性,指的是对‘数据被外界修改’持保守态度,因此在数据被修改的过程中,将数据处于锁定状态。通过操作的串行化,拒绝并发修改行为的产生。

悲观锁主要的缺陷是效率的损失和死锁的发生。其实并发操作并不是实时发生的,强制程序在某个处理单元进行串行处理,会极大的影响处理效率;同时不恰当的加锁顺序可能会导致依赖环的出现,从而导致死锁的发生。

2.2. 乐观锁

事后校验。相对于悲观锁,乐观锁机制采取更加宽松的加锁机制,其核心思路就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

乐观锁允许程序的并发处理,在最后数据写回时进行版本校验,如果期间数据没有变化,则操作成功;如果数据发生变化,则抛出异常,并重新计算,进行不断尝试,直至写回成功。

乐观锁,其本质上不存在资源锁定,因此从根源上杜绝了死锁的发生;同时由于内部自旋机制(失败尝试机制),只有在资源发生冲突时才会进行重试,在并发竞争不充分的情况下,大大提升了系统效率(当并发竞争很激烈的时候,耗费在自旋的资源可能会大于加锁的损耗,此时,乐观锁比悲观锁效率低)。

3. 乐观锁实现原理

3.1. CAS

CAS 的全称是 Compare And Swap 即比较交换,其算法核心思想如下:

执行函数:CAS(V,E,N)

其包含 3 个参数:

V 表示要更新的变量

E 表示预期值

N 表示新值

如果 V 值等于 E 值,则将 V 的值设为 N。若 V 值和 E 值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。

通俗的理解就是 CAS 操作需要我们提供一个期望值,当期望值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行 CAS 操作,但如果期望值与当前线程不符,则说明该值已被其他线程修改,此时不执行更新操作,但可以选择重新读取该变量再尝试再次修改该变量,也可以放弃操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值