AtomicInteger的getAndIncrement实现 [英] The getAndIncrement implementation of AtomicInteger

查看:96
本文介绍了AtomicInteger的getAndIncrement实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

AtomicInteger的getAndIncrement实现执行以下操作:

The getAndIncrement implementation of AtomicInteger does the following:

public final int getAndIncrement() {
    for (;;) {
        int current = get(); // Step 1 , get returns the volatile variable
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    } }

这不等于aVolatileVariable ++吗? (我们知道这是不正确的用法).如果没有同步,我们如何确保此完整操作是原子的?如果在步骤1中读取了变量"current"后,volatile变量的值发生了变化,该怎么办?

Isn't it an equivalent of aVolatileVariable++? (which we know is not a correct usage). Without synchronization, how are we ensuring that this complete operation is atomic? What if the value of the volatile variable changes after the variable 'current' is read in Step 1?

推荐答案

秘密调味料"在此调用中:

The "secret sauce" is in this call:

compareAndSet(current, next)

同时更改了原始易失性值,则"nofollow"> compareAndSet 操作将失败(并返回false),从而迫使代码继续执行循环.

The compareAndSet operation is going to fail (and return false) if the original volatile value has been changed concurrently after the read, forcing the code to continue with the loop.

这篇关于AtomicInteger的getAndIncrement实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆