CAS的ABA有没有必要解决?

王猴卖瓜

共 523字,需浏览 2分钟

 · 2021-03-14

  1. 什么是ABA问题?
      ABA示例:
      1).在多线程的环境中,线程a从共享的地址X中读取到了对象A。
      2).在线程a准备对地址X进行更新之前,线程a挂起。线程b将地址X中的值修改为了B。
      3).接着线程b或者线程c将地址X中的值又修改回了A。
      4).线程a恢复,接着对地址X执行CAS,发现X中存储的还是对象A,对象匹配,CAS成功。

  2. ABA问题需不需要解决?
      如果依赖中间变化的状态,需要解决。如果不是依赖中间变化的状态,对业务结果无影响。 

  3. 解决ABA问题。
      ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。
      从Java1.5开始JDK的atomic包里提供了AtomicStampedReference和AtomicMarkableReference类来解决ABA问题。


浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报