AtomicBoolean 没有 negate() 方法吗?

2022-09-02 00:47:14

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


答案 1

有点老...但真的不觉得答案很棒。

必须完全不同意这在硬件中不常见或仅在硬件中有用。您可能希望多个线程以相等的可能性在单个变量上切换...我用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;
        }
    }
}

答案 2

我幼稚的实现是这样的:

boolean v;
do {
  v=atomicBoolean.get();
} while(!atomicBoolean.compareAndSet(v, !v));

推荐