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中的原子操作类AtomicInteger及其实现原理