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 に答える