如何解决AtomicInteger类中getAndIncrement方法中的spin是什么意思?
在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 操作起作用为止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。