- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
线程标题应该是不言自明的......我对 AtomicBoolean
类的以下方法的规范有点困惑:
java.util.concurrent.atomic.AtomicBoolean#compareAndSet
java.util.concurrent.atomic.AtomicBoolean#getAndSet
我的假设是,当在 if
条件中用作 boolean 子句时,两者会导致相同的行为:
public class Test {
private AtomicBoolean flag = AtomicBoolean(false);
public void processSomeAction() {
if (flag.getAndSet(false)) { // Shouldn't this be similar to flag.compareAndSet(false)
// process some action
}
}
//...
private void internalMutatorMethod() {
// do some staff then update the atomic flag
flas.set(true);
}
}
假设我想检索当前标志值并自动更新它,这两种方法不应该产生相同的行为吗?
如果我遗漏了内部差异,我将非常感谢任何有关如何以及何时使用它们的解释。
最佳答案
documentation很清楚。
getAndSet
--> "自动设置给定值并返回之前的值。"compareAndSet
--> “如果当前值 == 预期值,则以原子方式将值设置为给定的更新值。”毫不奇怪,compareAndSet
有两个参数。
在您的具体情况下:
if (flag.getAndSet(false))
会将 flag
设置为 false
仅当其先前的值为 true
if (flag.compareAndSet(true, false))
关于java - AtomicBoolean 中 getAndSet 和 compareAndSet 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28147654/
Java AtomicReference#getAndSet 的用例是什么?换句话说,如果我在代码中使用的来自 AtomicReference 的唯一方法是 AtomicReference#getAn
我正在研究非阻塞算法。我意识到对 volatility 和 Atomic* 等领域的研究对此至关重要。那么这里有一个问题。 在AtomicReference中,compareAndSet使用unsaf
在这段代码中使用循环的目的是什么 public final int getAndSet(int newValue) { for (;;) { int current = get
我想编写类似于此 java 代码的 c# 代码: public class Syncer { private AtomicBoolean syncInProgress = AtomicBool
线程标题应该是不言自明的......我对 AtomicBoolean 类的以下方法的规范有点困惑: java.util.concurrent.atomic.AtomicBoolean#compareA
在我的一个程序中,我试图更新一个原子整数的值,但无法在 set() 和 getAndSet() 方法之间做出决定,因为它们两者似乎都做同样的事情。我已经通过了this和 this发布,但他们正在比较
我是一名优秀的程序员,十分优秀!