微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AtomicInteger类中getAndIncrement方法中的spin是什么意思?

如何解决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 操作起作用为止。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?