请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

CAS ABA问题

老师课上说CAS 的缺点使ABA问题
问题一:使用Atomic包下的工具类我还需要考虑ABA问题吗
问题二:解决ABA问题老师说是用版本号控制,那么这个版本号的读写应该是使用独占锁吧,这样才能保证每一个写操作比较版本号的时候一定是最新的版本号

正在回答 回答被采纳积分+3

1回答

提问者 WittChen 2021-08-15 12:26:35

自问自答,总结下,老师看我说的对不对

联系上下总结的时候突然想通了,其实CAS就是老师课堂上说的,CAS其实就是从硬件上实现原子性,CPU的特殊指令,例如:CPU一个指令就可以实现“比较+替换”,过程中不会被打断,我只拿了一半,我觉得这才是是CAS,他就是特殊指令把原来需要多个指令组合成一个原子操作的指令,除此之外没有其他的功能,这就解释了老师课堂上为什么说CAS有ABA问题,CAS其实没有自带检查预期值或者什么结果值,这个应该是为了解决ABA问题才出现的解决方案,不然我理解不了如果有ABA问题atmoic包下的所有类,我们在用的时候还要考虑ABA问题,那么这也太坑了吧

还有自旋,个人认为也是不应该属于CAS范畴之内,它只是想要该线程一定要操作成功这个操作,因为线程在CAS的时后人为的会添加验证比如版本号或者检查预期值之类的,保证线程安全,所以可能是会失败的,所以要自旋,缺点应该是自旋的缺点,不应该是CAS的缺点

以上是我的个人总结,如果油不对之处,望老师指出^ ^

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    可以用带时间戳的atomic类
    回复 有任何疑惑可以回复我~ 2021-08-15 21:05:04
  • 提问者 WittChen 回复 悟空 #2
    好吧,可能我理解错了ABA问题,刚刚搜索了下,ABA通俗的来讲就是两个线程同时对A进行修改,同时读到了预期值,一个线程把A修改成B又把B改回了A那么对于另外的线程是A确实没变化,那么就修改成功了,ABA的问题在于修改为B的过程对另一个线程是不可见的,我这样的理解对吗,所以也间接回答了我上一个问题,使用普通的atomic类是要考虑ABA问题,但是如果只数值的结果负责不考虑过程那么就不用考虑ABA问题了
    回复 有任何疑惑可以回复我~ 2021-08-15 22:14:08
  • 悟空 回复 提问者 WittChen #3
    理解是对的
    回复 有任何疑惑可以回复我~ 2021-08-16 03:09:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信