侧边栏壁纸
博主头像
Monkey部落博主等级

Monkey部落,分享技术、经验、遇到的问题及解决方法,欢迎大家互相讨论分享。

  • 累计撰写 59 篇文章
  • 累计创建 36 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

CAS ABA问题

Monkey部落
2024-04-08 / 0 评论 / 0 点赞 / 492 阅读 / 284 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-04-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

CAS ABA问题

描述

多个线程对某一个原子类进行操作时,某个线程将原值A改成了B,又改回了A,此时另一个线程也对该值进行操作,发现值仍然是A,就会认为它没有被修改过,从而执行CAS操作,但是此时A并不是原来的A,这个就是ABA问题。

解决

使用版本号或者时间戳来表示数据的变化,JUC包中AtomicStampedReference和AtomicMarkableReference可以解决ABA问题

AtomicStampedReference类使用一个标记(stamp)来记录对象的版本号,当对象发生变化时,版本号会自动增加。通过比较对象引用和版本号来判断对象是否发生过变化,从而避免了 ABA 问题。

AtomicMarkableReference类类似于AtomicStampedReference, 但它使用一个布尔标记(mark)来表示对象的状态是否发生过改变,同样地,通过比较对象引用和标记来判断对象是否发生过变化,以避免 ABA 问题。

0

评论区