乐观锁和悲观锁

悲观锁应用于很多传统的关系型数据库,读锁,写锁,行锁,表锁。全都是在操作前就进行上锁,java中synchronized关键字也是悲观锁。

乐观锁,  只会在每次更新的时候去判断其他人在此期间有没有更新,乐观锁适用于多读的应用类型,这样可以提高吞吐量。

悲观锁的问题,在多线程的竞争下,加锁释放锁会导致上下文切换和调度延时,引起性能问题。一个线程持有锁会导致其他需要此锁的线程挂起。一个低优先级的线程持有锁的情况下会导致高优先级线程等待,导致优先级导致,引起性能问题。

乐观锁其实就是一种思想,设想数据并没有冲突,每次更新的时候正式检查数据是否发生冲突,有冲突就重试,直到成功。其实现方式有一种比较典型的就是 Compare and Swap ( CAS )。

CAS:是乐观锁的技术,每当多个线程使用CAS对同一个线程进行更新时,只会有一个线程成功,而且其他线程不会被挂起,而是被告知失败,重新尝试知道成功。

乐观锁是一种思想,而CAS是乐观锁的实现方式。

CAS需要三个操作数:需要读写的内存位置V,进行比较的预期原值A,需要拟写入的值B。在读写前将内存V处的值与A进行匹配,成功则写入,失败则将预期原值A更新。相较于synchronized这种阻塞算法,CAS则是非阻塞算法的常见实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值