当前位置: 首页 > 知识库问答 >
问题:

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

濮升
2023-03-14

在AtomicInteger类的getAndIncrement方法中,调用了unsafe类的getAndAddInt方法,该方法包含compareAndSwapInt方法和自旋(Do...While)。compareAndSwapInt方法是线程安全的,那么为什么不只是更改compareAndSwapInt方法中的值,还需要旋转是安全的呢?谢谢你的回答。

共有1个答案

韩佐
2023-03-14

你在看什么来源?至少从JDK11开始,并且仍然在当前的JDK16中,unsafeGetAndAddInt的实现是:

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操作工作。
 类似资料:
  • 问题内容: AtomicInteger的getAndIncrement实现执行以下操作: 它不等于aVolatileVariable ++吗?(我们知道这是不正确的用法)。没有同步,我们如何确保此完整操作是原子的?如果在步骤1中读取了变量“ current”后,volatile变量的值发生了变化,该怎么办? 问题答案: “秘密调味料”在此调用中: 如果在读取 后 同时更改了原始易失性值,则该操作将

  • 很多 synchronized 里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然 synchronized 里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在 synchronized 的边界做忙循环,这就是自旋。如果做了多次循环发现还没有获得锁,再阻塞,这样可能是一种更好的策略。

  • 问题内容: 我的问题如上所述。抱歉,可能是重复的,但最后找不到一个示例。 为什么不只使用它作为参数? 问题答案: 是可参数化的类,因此可以使用where 类型的语法。通过编写,您可以声明一个可以是任何类型的对象(是通配符)。该类型是包含类元信息的类型。 通过指定特定类型来引用泛型类型始终是一种好习惯,这是通过尊重您的习惯(您知道可参数化的)来使用的,但并不限制参数具有特定类型。 有关泛型和通配符的

  • 问题内容: 我遇到了这段代码,我不退出这一行来理解它的含义或它在做什么。 我知道是什么还是什么,但是什么是? 问题答案: 这是构造函数重载: 您可以通过缺少返回类型来判断此代码​​是构造函数,而不是方法。这与在构造函数的第一行中调用以初始化扩展类非常相似。您应该在构造函数的第一行中调用(或的任何其他重载),从而避免构造函数代码重复。 您也可以看看这篇文章:Java中的构造方法重载-最佳实践

  • 问题内容: Java中方法声明的语法如下所示: Java方法声明BNF: 我想知道方括号是什么意思。 谁能给我一个例子吗? Java中的方法声明是否如上(泛型如何)? 在哪里可以找到Java的完整和实际的BNF语法? 问题答案: 方括号表示方法返回数组。例如,您可以编写一个返回int数组的方法,如下所示: 但是,许多人不熟悉此语法,最好避免使用。 您可以在此处找到Java 7的完整语法:http

  • 问题内容: 我已经和Lombok一起使用并积极使用了2个月。使用Java时,我会更加熟悉。但是,我第一次遇到了该语言的以下语法结构: 这是什么意思,如何编译? 问题答案: 这是一种实验性的Lombok语法,其创建目的是在引用多个注释时支持间接层,而不是使用。 语法有点奇怪;要使用这3种功能中的任何一种,您必须在中包装要应用于构造函数/方法/参数的注释。要应用多个注释,请使用。注释本身显然也可以具有