AtomicnIteger会存在ABA问题吗?

bug师姐 2019-07-14 09:51:18
看AtomicnIteger的如下源码,觉得它会存在ABA问题
public final int incrementAndGet() {
for (;;) {
int current = get(); // 获取旧值
int next = current + 1; // 新值
// 比较成功后赋值
if (compareAndSet(current, next))
return next;
}
}


JDK8源码如下,看着好像不会,具体不是太清楚,毕竟unsafe作了啥操作我也不知道啊
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}


value被volatile修饰了,是不是就不会有ABA问题了,因为我觉得volatile保证了可见性。


具体还麻类懂的大神赐教!!1
...全文
251 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
勇敢牛牛_ 2019-07-16
  • 打赏
  • 举报
回复
不要用基本类型以及String测试,他们本身就是不存在线程安全问题,修改自然可以成功
bug师姐 2019-07-16
  • 打赏
  • 举报
回复
引用 5 楼 huanqingdong 的回复:
引用 4 楼 zcl_love_wx 的回复:
[quote=引用 3 楼 huanqingdong 的回复:]
一直增加不会存在,出现了B说明B大于A,不可能有线程往下减数再回到A
是我写得不全,这样说哈,比如我们用AtomicnIteger统计在线人数,这个人数是时而增,时而减的,这样会出现ABA问题吗


如果不是往一个方向改会有aba问题

可以用带版本的类解决 AtomicStampedReference 和 AtomicMarkableReference [/quote]
我测了测,如果是用incrementAndGet和decrementAndGet实现加和减,就不会有问题。有ABA问题的是直接用compareAndSet赋值
bug师姐 2019-07-16
  • 打赏
  • 举报
回复
引用 1 楼 wxgxgp 的回复:
不会,会追加版本号

我测了下,会有ABA问题的。我用的compareAndSet方法试了试,即使被另外两个线程修改后(一个线程修改,另一个线程把值修改回来),当前线程的修改还是会成功。
faith.huan 2019-07-15
  • 打赏
  • 举报
回复
引用 4 楼 zcl_love_wx 的回复:
引用 3 楼 huanqingdong 的回复:
一直增加不会存在,出现了B说明B大于A,不可能有线程往下减数再回到A
是我写得不全,这样说哈,比如我们用AtomicnIteger统计在线人数,这个人数是时而增,时而减的,这样会出现ABA问题吗
如果不是往一个方向改会有aba问题 可以用带版本的类解决 AtomicStampedReference 和 AtomicMarkableReference
faith.huan 2019-07-15
  • 打赏
  • 举报
回复
一直增加不会存在,出现了B说明B大于A,不可能有线程往下减数再回到A
bug师姐 2019-07-15
  • 打赏
  • 举报
回复
引用 3 楼 huanqingdong 的回复:
一直增加不会存在,出现了B说明B大于A,不可能有线程往下减数再回到A
是我写得不全,这样说哈,比如我们用AtomicnIteger统计在线人数,这个人数是时而增,时而减的,这样会出现ABA问题吗
bug师姐 2019-07-14
  • 打赏
  • 举报
回复
我在网上看到说,会有ABA问题。还是说旧版本会有ABA问题,新版本没有ABA问题呀???
勇敢牛牛_ 2019-07-14
  • 打赏
  • 举报
回复
不会,会追加版本号

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧