悲观锁和乐观锁

悲观锁:
某个线程访问临界区修改数据的时候,悲观的认为其他线程也会并行修改,所以在线程修改之前加锁互斥访问
悲观锁包括互斥锁,读写锁,自旋锁
互斥锁和自旋锁的区别:

  • 自旋锁加锁时,加不到锁,线程不会切换(时间片未到的情况下),会持续的尝试拿锁,直到拿到的情况下
  • 互斥锁加锁时,加不到锁,线程会发生切换(时间片未到的情况下),进入睡眠,当占有互斥锁的线程释放锁时,申请锁的线程被唤醒来加锁

自旋锁的优点和缺点:

  • 自旋锁的效率远高于互斥锁,自旋锁加不到锁时,不会线程切换
  • 自旋锁加不到锁时,一直占用cpu尝试加锁,如果不能短时间内获得锁,会使cpu效率降低
  • 适用于临界区代码较短时

乐观锁:
某个线程访问临界区修改数据时,乐观的认为只有本线程会修改数据,所以不加锁.在修改之前要判段数据有没有被修改过,若修改了,本线程不能再修改数据;若没有修改,则修改数据,适用于读多写少的场景
使用到的技术:
版本号控制和CAS(compare and swap)无锁编程

版本号控制:检查版本号,判断版本号有没有发生变化,若没有发生变化,修改产生新的版本
CAS

  • V:内存地址
  • A:旧的预期值
  • B:将内存地址值修改程新值

在修改之前,先判断V和A是否相等,若相等,则可以修改;不相等,则重新获取V的值,重新进行判断
缺点:会产生ABA的问题,获取A值后,其他发生了修改但最终没有改变A的值(即+1,-1)
我们可以将版本号和CAS配合起来解决

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值