Java基础-锁(二)

悲观锁和乐观锁

根据线程是否要锁住同步资源可以将锁分为悲观锁和乐观锁。

悲观锁

悲观锁认为自己在使用数据的时候一定有线程来修改数据,所以在获取到数据的时候会先加锁,确保数据不会被别的线程修改。
实现有:关键字 synchronized 、接口 Lock的实现类。
适用于写多读少的场景。

乐观锁

乐观锁认为自己在使用数据的时候不会被别的线程修改,所有不会添加锁,只是在更新数据的时候才去判断之前有没有别的线程更新了这个数据。
实现有:使用CAS算法,例如:atomic包的原子类。
适用于读多写少的场景。

CAS算法

CompareAndSwap:比较与交换。
处理逻辑:当多条线程同时来修改堆上线程共享的值时,会先将堆上的值拷贝到自己的工作栈中。
当线程修改了自己工作栈中值后将值更新到堆上时,先进行判断,预期值和当前堆上的值是否一致,如果一致,则更新。当更新失败时要不自旋、要不报错,如果自旋一般设置一个默认的自旋次数。
此时可以参考Java内存模型(JMM,区别于JVM内存模型) 加深影响。

CAS算法中的ABA问题:
主存中的原始值:0
线程1:通过CAS将其修改为1
线程2:通过CAS将其修改为0
线程3:通过CAS来判断时以为没有修改
解决:通过增加版本号来解决。JAVA中已经解决了这个问题。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值