Java的AtomicBitSet实现


问题内容

标准api不包含AtomicBitSet实现。我可以将自己放在AtomicIntegerArray之上,但也不要这样做。

是否有人知道根据与Apache 2兼容的许可证发布的现有实现?我只需要基本操作即可设置和检查位。

编辑:

代码是性能和内存的关键,因此我想避免同步或每个标志使用整数(如果可能)。


问题答案:

我将使用AtomicIntegerArray,并且每个整数将使用32个标志,这将为您提供与BitSet相同的密度,但无需使用锁来保证线程安全。

public class AtomicBitSet {
    private final AtomicIntegerArray array;

    public AtomicBitSet(int length) {
        int intLength = (length + 31) >>> 5; // unsigned / 32
        array = new AtomicIntegerArray(intLength);
    }

    public void set(long n) {
        int bit = 1 << n;
        int idx = (int) (n >>> 5);
        while (true) {
            int num = array.get(idx);
            int num2 = num | bit;
            if (num == num2 || array.compareAndSet(idx, num, num2))
                return;
        }
    }

    public boolean get(long n) {
        int bit = 1 << n;
        int idx = (int) (n >>> 5);
        int num = array.get(idx);
        return (num & bit) != 0;
    }
}