乐观锁和悲观锁

1.悲观锁

线程每次访问能同步资源时,会给操作数据加锁,保证临界区的程序同一时间只能有一个线程执行。没获得锁线程会进入阻塞队列。等待再次获取锁。

2.乐观锁

又称为“无锁”。通过CAS技术保证线程执行的安全性。
乐观锁适用于读多写少的场景,避免频繁加锁影响性能;
悲观锁适用于写多读少的场景,避免频频繁失败和重试影响性能。

3.CAS

CAS全称(Compare And Swap)比较并替换,是一种无锁算法。在CAS中,有3个值:
V:要更新的内存地址;
E: 旧值
N:新值
当且仅当V的值等于E时,将V的值修改为N,否则什么都不做。
当多个线程同时使用CAS操作一个变量时,只有一个会成功,其余都会失败。失败的可允许再次尝试或者放弃操作。

4.CAS原子操作的3大问题

(1)ABA问题
描述:一个值原来是A,变成了B ,又变成了A;这时候CAS是检测不出变化的,但实际上是被更新了两次。
解决思路:在变量前面加版本号或者时间戳。
(2)循环时间开销大
描述:CAS多与自旋结合,如果自旋CAS长时间不成功,会占用大量的CPU资源;
解决思路:让JVM支持处理器提供的pause指令。
pause指令:让自旋失败时,失眠一小时再继续自旋,降低读的操作频率。
(3)只能保证一个对象的原子操作;
解决思路:1.使用JDK1.5就开始提供的AutomicReference类保证对象之间的原子性,把多个变量放在一个对象里进行CAS操作;
2.使用锁,锁内的临界区代码可以保证只有当前线程能够操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值