标准应用程序接口不包含AtomicBitSet实现。我可以在AtomicIntegerArray上运行我自己的代码,但我不希望这样做。
有没有人知道在与Apache2兼容的许可下发布的现有实现?我只需要基本的操作来设置和校验位。
编辑:
代码对性能和内存都很重要,所以我希望尽可能避免同步或每个标志一个整数。
发布于 2012-09-14 20:53:50
我将使用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-14 20:35:58
看看http://www.javamex.com/tutorials/synchronization_concurrency_7_atomic_integer_long.shtml
不完全是使用BitSet,而是使用AtomicInteger。
https://stackoverflow.com/questions/12424633
复制相似问题