19

标准 api 不包括 AtomicBitSet 实现。我可以在 AtomicIntegerArray 上滚动我自己的,但我也不希望这样做。

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

编辑:

该代码对性能和内存都至关重要,因此我想尽可能避免同步或每个标志的整数。

4

2 回答 2

22

我将使用 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;
    }
}
于 2012-09-14T12:53:50.217 回答
0

看看http://www.javamex.com/tutorials/synchronization_concurrency_7_atomic_integer_long.shtml

不完全使用 BitSet,而是使用 AtomicInteger。

于 2012-09-14T12:35:57.610 回答