加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么Java AtomicInteger中的getAndIncrement()中存在循环?

发布时间:2020-12-15 04:37:59 所属栏目:Java 来源:网络整理
导读:getAndIncrement的源代码是: public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current,next)) return current; }} 我不明白为什么有一个循环.如果其他一些线程更改了值,那么它怎么可能是
getAndIncrement的源代码是:

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

我不明白为什么有一个循环.如果其他一些线程更改了值,那么它怎么可能是原子的呢?

假设值为5,然后我调用getAndIncrement(),我们期望它为6,但同时其他一些线程将值更改为6,然后getAndIncrement()将值设为7,这不是预期.

我哪里错了?

解决方法

循环将继续运行,直到它设法执行get(),1和compareAndSet,而没有任何其他线程首先进入compareAndSet.如果另一个线程确实获得了compareAndSet,则该线程的compareAndSet将失败,并且循环将重试.

最终结果是每次调用getAndIncrement()都会导致该值只有一个增量.如果该值最初为5,并且两个线程调用getAndIncrement(),则一个将返回6而另一个将返回7.

换句话说:其中一个似乎完全发生在另一个之后,这就是“原子”的意思.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读