首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java的AtomicBitSet实现

java的AtomicBitSet实现
EN

Stack Overflow用户
提问于 2012-09-14 20:31:38
回答 2查看 3.8K关注 0票数 19

标准应用程序接口不包含AtomicBitSet实现。我可以在AtomicIntegerArray上运行我自己的代码,但我不希望这样做。

有没有人知道在与Apache2兼容的许可下发布的现有实现?我只需要基本的操作来设置和校验位。

编辑:

代码对性能和内存都很重要,所以我希望尽可能避免同步或每个标志一个整数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-14 20:53:50

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

代码语言:javascript
复制
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;
    }
}
票数 22
EN

Stack Overflow用户

发布于 2012-09-14 20:35:58

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12424633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档