问题描述
在AtomicInteger类的getAndIncrement方法中,调用了unsafe类的getAndAddInt方法,其中包含compareAndSwapInt方法和spin(do...while)。 compareAndSwapInt 方法是线程安全的,那么为什么不直接改变compareAndSwapInt 方法中的值,还需要spin 才安全呢? 谢谢你的回答。
解决方法
你在看什么来源?至少从 JDK11 开始,并且仍然在当前的 JDK16 中,Unsafe
's getAndAddInt
的实现是:
int v;
do {
v = getIntVolatile(o,offset);
} while (!weakCompareAndSetInt(o,offset,v,v + delta));
return v;
我不知道你从哪里得到 compareAndSwapInt
。
上面的代码有一个旋转,因为 CAS 总是这样工作的。 (Compare-And-Set): 这段代码说,例如一个 AtomicInteger 目前是 '5',你正试图给它加 2:
- 获取当前值(它是 5)
- 告诉 CPU:嘿,CPU,如果值是仍然 5,你能做到 7 吗?否则,请不要做任何事情。告诉我你是否做到了。
- 如果你做到了,那就太好了。返回 5.
- 如果没有,请返回到 1。并继续这样做,直到 CAS 操作起作用为止。