Реализация AtomicBitSet для java

Стандартный api не включает реализацию AtomicBitSet. Я мог бы свернуть свой собственный поверх AtomicIntegerArray, но предпочел бы не слишком.

Кто-нибудь знает о существующей версии, выпущенной по лицензии, совместимой с Apache 2? Мне нужны только базовые операции для установки и проверки бит.

Edit:

Этот код является критичным как для производительности, так и для памяти, поэтому я хотел бы избежать синхронизации или целого числа на флаг, если это возможно.

Ответы

Ответ 1

Я бы использовал 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;
    }
}