乐观锁与悲观锁

乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

悲观锁:总是悲观的认为某个线程在处理某份资源的时候,会有别的线程来修改资源,所以在资源上加锁,一旦某个线程获取该锁,别的线程想要获取该资源就会阻塞直至获取锁的线程释放该锁(独占锁 synchronzied ReentrantLock)

乐观锁的实现机制:

CAS(compareAndSet):

三个基本操作数:

V:需要读写的内存值

A:要进行比较的值

B:要修改的新值

实现步骤:

1)获取V值,并赋值给A

2)进行一系列操作后,想要把B值赋值给V值,重新获取V值,判断V 是否等于 A, 若相等则V = B, 否则重新进行上面的步骤,直至赋值成功!

缺点:

1)会出现ABA问题, 即线程1 在对V进行操作的时候,线程2先把V修改了一遍,然后又修改回的原值(V的变化:原值-》新值-》原值),线程1在比较A与V的时候,发现没有变化,就修改成功了。

2)在资源竞争激烈的情况下, CAS出现自旋的概率较大,易浪费CPU资源

ABA问题改进:

使用版本号(version)来解决ABA问题, 每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1操作,否则就执行失败。

使用场景:

乐观锁适合于:多读少写

悲观锁适合于:多写

转载于:https://www.cnblogs.com/DDiamondd/p/11321467.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值