【问题标题】: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 是安全的呢?
谢谢你的回答。
【问题讨论】:
标签:
java
compare-and-swap
atomicinteger
【解决方案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 操作正常。