CAS机制(多线程)

 

---- 什么是CAS机制

   CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V、旧预期值A、要修改的新值B

   当要更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同的时候,才会将内存地址V对应的值修改为B

举个栗子

  1.  在一个内存地址为V内存中,储存着变量值10(即此时A=10)
  2. 此时,来了一个线程A,想对该变量进行增加1操作(即此时对线程A来说:A=10,B=11)
  3. 但是,当线程A操作之前,被线程B插入率先将该变量进行修改成11(即此时A=11)
  4. 接着,等线程A想来修改的时候,通过内存地址V获取当前最新的值与自身线程的预期值进行比对(此时线程A的A=10),发现不一样,导致更新失败
  5. 线程A重新获取内存地址V的当前值,并重新计算想要修改的新值,即自旋操作。(此时对线程A来说,A=11,B=12)
  6. 这一次没有其他线程的干扰,线程A通过获取内存地址V的实际值,成功比较后,并且将内存地址V的值修改成12

--- 优点

    由于Synchronized是个重量级别的锁,每次使用会引起用户态和核心态之间进行转换,在转换之间需要耗费很多的处理时间,所以,如果使用CAS机制,在并发不是很多的情况下,可以减少用户态和核心态进行切换,从而提高系统性能。

---缺点

  • cpu开销大,在高并发下,许多线程,更新一变量,多次更新不成功,循环反复,给cpu带来大量压力
  • 只是一个变量的原子性操作,不能保证代码块的原子性
  • ABA问题(不过一般极少出现)

举个栗子(ABA问题)

  1. 小埋去存银行卡有200块钱,去提款机取钱100,恰巧机器有点问题,在进行取款提交操作后台开启了两个线程A和B(200->100)
  2. 线程A成功执行,而且线程B阻塞了,此时小埋银行卡的余额为100
  3. 此时,小埋的哥哥给她卡了打了100块,此时小埋银行卡的余额为200
  4. 然后,线程B此时就又开始执行了,发现卡里的余额200和自身线程余额期待值一样,进行修改(200->100)
  5. 最后,小埋就只能去找柜台寻求帮助了,因为正常情况下,她现在的卡里应该还有200块

如何解决aba问题:
对内存中的值加个版本号,在比较的时候除了比较值还的比较版本号。

 

参考资料:

  《深入了解Java虚拟机》

   漫画:什么是 CAS 机制?

  漫画:什么是CAS机制?(进阶篇)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值