AtomicBoolean没有negate()方法吗?

16 java concurrency multithreading

没有java.util.concurrent.atomic.AtomicBoolean可以自动否定/反转值的方法?我可以用另一种方式吗?我错过了什么吗?

小智 16

有点老......但并没有真正觉得答案很棒.

必须完全不同意这不常见或仅在硬件中有用.您可能需要多个线程在单个变量上切换,具有相同的可能性...我使用AtomicLong制作假布尔值.这是从JMS MessageListener采用的,我需要一半时间响应特定消息而另一半响应另一半.

public class Mock {
    private static AtomicLong count = new AtomicLong(0);

    public boolean respond() {
        long currentCount = count.getAndIncrement();

        if (currentCount % 2 == 0) {
            return true;
        } else {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 14

我天真的实现是这样的:

boolean v;
do {
  v=atomicBoolean.get();
} while(!atomicBoolean.compareAndSet(v, !v));
Run Code Online (Sandbox Code Playgroud)

  • @skaffman:在这种情况下compareAndSet()将失败,返回false并重新进入循环.如果我有任何错误,请纠正我. (3认同)
  • 不,不是因为切换不是原子的。AtomicBoolean 的值可以在调用 get() 和调用 compareAndSet() 之间改变 (2认同)
  • 为什么不在AtomicBoolean中实现? (2认同)

cos*_*lev 5

您可以AtomicBoolean.negate()通过使用AtomicInteger.getAndIncrement()和将偶数视为true和奇数作为来进行模拟false。数字的实际值应该被忽略,这样你就不用关心整数溢出了。