gpt4 book ai didi

java - 无锁圆阵

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:30 25 4
gpt4 key购买 nike

我正在考虑实现一个无锁循环数组。一个问题是以无锁方式维护头指针和尾指针。我想到的代码是:

int circularIncrementAndGet(AtomicInteger i) {
i.compareAndSet(array.length - 1, -1);
return i.incrementAndGet();
}

然后我会做类似的事情:

void add(double value) {
int idx = circularIncrementAndGet(tail);
array[idx] = value;
}

(请注意,如果数组已满,旧值将被覆盖,我对此没有意见)。

有人发现这个设计有问题吗?我怀疑可能存在我没有看到的竞争条件。

最佳答案

更简单的方法是使用 2 的幂大小并执行以下操作。

 final double[] array;
final int sizeMask;
final AtomicInteger i = new AtomicInteger();

public CircularBuffer(int size) {
assert size > 1 && ((size & (size -1)) == 0); // test power of 2.
array = new double[size];
sizeMask = size -1;
}

void add(double value) {
array[i.getAndIncrement() & sizeMask] = value;
}

关于java - 无锁圆阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com