kobe_sky 2016-07-01 04:15 采纳率: 100%
浏览 3224
已采纳

Java AtomicInteger incrementAndGet也会存在线程不安全情况

public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

    以上是AtomicInteger的源码,使用自旋CAS的方式保证在最新值上修改。但是如果程序在compareAndSet以后,return之前其他线程执行了int next = current + 1;那么返回的值不一样不是我想要的吗?
    例如:一开始的值是1,自旋加1以后应该返回2,但在更新值以后、return之前另外一个线程执行了int next = current + 1;那么返回的值不就是3了吗???
  • 写回答

3条回答 默认 最新

  • little_how 2016-07-01 06:09
    关注

    也许你没有理解线程的私有性。
    线程的并发是出现在共享的变量的。
    也就是说,能出现并发的值是value;
    也就是对value的读取和修改;
    而方法中的
    current和next的都是在线程的栈内存中的,每个线程都会维护线程的栈帧。
    两个线程的改变是没有关系的,
    如果当前线程修改后next=2;
    第二个线程的next=3是没有关系的,他们之间的联系是value。
    在第一个线程的value=2就够了,第二个线程是value=3那么得到的自然是3

    如果有帮助,希望结帖

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置