gpt4 book ai didi

java - 使用 AtomicIntegerArray 在 Java 中实现 AtomicByteArray

转载 作者:行者123 更新时间:2023-12-01 12:51:04 25 4
gpt4 key购买 nike

我需要一个 AtomicByteArray 来用于模仿 Java 的 AtomicIntegerArray 的内存关键型应用程序。 。我的实现将四个字节包装成一个整数并使用 AtomicIntegerArray。

get() 实现很简单,set() 实现相当简单。 compareAndSwap() 比较棘手。我的实现如下所示(它在单线程下工作得很好)。

我正在尝试识别竞争条件。一种潜在的情况是,值在 get()compareAndSet() 调用之间发生变化并交换回来,但这似乎无害。

我是否遗漏了任何可能出错的地方?

/**
* Atomically sets the element at position {@code i} to the given
* updated value if the current value {@code ==} the expected value.
*
* @param i the index
* @param expect the expected value
* @param update the new value
* @return true if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public boolean compareAndSet(final int i, final byte expected, final byte val) {
int idx = i >>> 2;
int shift = (i & 3) << 3;

while (true) {
final int num = this.array.get(idx);
// Check that the read byte is what we expected
if ((byte)(num >> shift) != expected) {
return false;
}
// If we complete successfully, all is good
final int num2 = (num & ~(0xff << shift)) | ((val & 0xff) << shift);
if ((num == num2) || this.array.compareAndSet(idx, num, num2)) {
return true;
}
}
}

更新:我已经实现了 AtomicByteArray 的基本版本它集成了下面答案中的改进。

最佳答案

您可以考虑使用 mask 。这可能会更快/更干净。

int idx = i >>> 2;
int shift = (i & 3) << 3;
int mask = 0xFF << shift;
int expected2 = (expected & 0xff) << shift;
int val2 = (val & 0xff) << shift;

while (true) {
final int num = this.array.get(idx);
// Check that the read byte is what we expected
if ((num & mask) != expected2) return false;
// If we complete successfully, all is good
final int num2 = (num & ~mask) | val2;
if ((num == num2) || this.array.compareAndSet(idx, num, num2)) {
return true;
}
}

您希望在循环内做最少的工作,以便在出现争用时可以尽快重试。

我不确定 num == num2 的帮助大于伤害。我建议你尝试一下而不进行比较。

关于java - 使用 AtomicIntegerArray 在 Java 中实现 AtomicByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24212822/

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