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:

  1. 获取当前值(它是 5)
  2. 告诉 CPU:嘿,CPU,如果值是仍然 5,你能做到 7 吗?否则,请不要做任何事情。告诉我你是否做到了。
  3. 如果你做到了,那就太好了。返回 5.
  4. 如果没有,请返回到 1。并继续这样做,直到 CAS 操作起作用为止。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...