java的AtomicBitSet实现

hen*_*nry 19 java concurrency

标准api不包含AtomicBitSet实现.我可以在AtomicIntegerArray之上滚动自己,但也不愿意.

是否有人知道在与Apache 2兼容的许可下发布的现有实现?我只需要基本操作来设置和检查位.

编辑:

代码是性能和内存关键,所以我想尽可能避免同步或每个标志的整数.

Pet*_*rey 21

我会使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @PeterLawrey不应该`int bit = 1 << n;```int bit = 1 <<(n%32);``get`和`set`? (2认同)
  • @tim_yates在Java中,做这样的模数没有效果,因为`int`和`&63`的移位是`&31`. (2认同)