AtomicInteger类中getAndIncrement方法中的spin是啥意思?

Posted

技术标签:

【中文标题】AtomicInteger类中getAndIncrement方法中的spin是啥意思?【英文标题】:What is the meaning of the spin in the getAndIncrement method in the AtomicInteger class?AtomicInteger类中getAndIncrement方法中的spin是什么意思? 【发布时间】:2021-04-11 14:19:15 【问题描述】:

在AtomicInteger类的getAndIncrement方法中,调用了unsafe类的getAndAddInt方法,其中包含compareAndSwapInt方法和spin(do...while)。 compareAndSwapInt 方法是线程安全的,那么为什么不只是改变 compareAndSwapInt 方法中的值,还需要 spin 是安全的呢? 谢谢你的回答。

【问题讨论】:

【参考方案1】:

你在看什么来源?至少从JDK11开始,并且还在当前的JDK16中,Unsafe's getAndAddInt的实现是:

int v;
do 
  v = getIntVolatile(o, offset);
 while (!weakCompareAndSetInt(o, offset, v, v + delta));
return v;

我不知道你从哪里得到compareAndSwapInt

上面的代码有一个旋转,因为 CAS 总是这样工作。 (比较并设置):该代码表示​​,例如,当前为“5”的 AtomicInteger 并且您正在尝试向其添加 2:

    获取当前值(为 5) 告诉CPU:嘿,CPU,IF这个值是还是5,你能把它变成7吗?否则,请不要做任何事情。告诉我你是否成功了。 如果你成功了,那就太好了。返回 5。 如果没有,请返回 1。并继续这样做,直到 CAS 操作正常。

【讨论】:

以上是关于AtomicInteger类中getAndIncrement方法中的spin是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——CAS

java中的原子操作类AtomicInteger及其实现原理

Java并发编程的艺术 -- 原子操作类和并发工具类(第七八章)

CountDownLatch用法实践

juc杂记

线程安全—原子性