我正在考虑实现一个无锁环形数组。其中一个问题是以无锁的方式维护头指针和尾指针。我想到的代码如下:
int circularIncrementAndGet(AtomicInteger i) {
i.compareAndSet(array.length - 1, -1);
return i.incrementAndGet();
}
那么我会做类似这样的事情:
void add(double value) {
int idx = circularIncrementAndGet(tail);
array[idx] = value;
}
请注意,如果数组已满,则旧值将被覆盖,我对此没有问题。
有人看到这个设计存在问题吗?我怀疑可能存在我没有发现的竞争条件。