当前位置: 首页 > 面试题库 >

AtomicInteger的getAndIncrement实现

熊俊人
2023-03-14
问题内容

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

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变量的值发生了变化,该怎么办?


问题答案:

“秘密调味料”在此调用中:

compareAndSet(current, next)

如果在读取
同时更改了原始易失性值,则该compareAndSet操作将失败(并返回false),从而迫使代码继续循环。
__



 类似资料:
  • 在AtomicInteger类的getAndIncrement方法中,调用了unsafe类的getAndAddInt方法,该方法包含compareAndSwapInt方法和自旋(Do...While)。compareAndSwapInt方法是线程安全的,那么为什么不只是更改compareAndSwapInt方法中的值,还需要旋转是安全的呢?谢谢你的回答。

  • java.util.concurrent.atomic.AtomicInteger类提供对底层int值的操作,可以原子方式读取和写入,还包含高级原子操作。 AtomicInteger支持底层int变量的原子操作。 它具有get和set方法,类似于对volatile变量的读写操作。 也就是说,集合与同一变量上的任何后续获取具有先发生关系。 原子compareAndSet方法也具有这些内存一致性功能。

  • 问题内容: 我正在遍历该类中方法的Java(Java 6)源代码。 相应的代码如下: compareAndSet方法调用一个本地方法来执行分配。主要有两个问题: 无限循环有何帮助? 在“ if(compareAndSet(current,next))”条件下可能返回false的情况是什么?在这种情况下,代码可能会陷入无限循环。如果可以保证compareAndSet总是返回“ true”,那么我们是

  • 问题内容: 我有点理解AtomicInteger和其他Atomic变量允许并发访问。但是在什么情况下通常使用此类? 问题答案: 有两个主要用途: 作为可以同时被多个线程使用的原子计数器(,等) 作为支持比较和交换指令()来实现非阻塞算法的原语。 这是BrianGöetz的中的非阻塞随机数生成器的示例: 如你所见,它的工作原理与几乎相同incrementAndGet(),但是执行任意计算(calcu

  • 本文向大家介绍讲讲 AtomicInteger 的使用?相关面试题,主要包含被问及讲讲 AtomicInteger 的使用?时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 和的方法有什么区别?该文档没有太多关于: 最终设置为给定值。 似乎存储的值不会立即设置为所需值,而是计划在将来的某个时间设置。但是,这种方法的实际用途是什么?有什么例子吗? 问题答案: 直接引自“ JDK-6275329:向原子类添加lazySet方法” : 作为Mustang的最后一个JSR166后续文章,我们向Atomic类(AtomicInteger,AtomicReferenc