作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个 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/
我需要一个 AtomicByteArray 来用于模仿 Java 的 AtomicIntegerArray 的内存关键型应用程序。 。我的实现将四个字节包装成一个整数并使用 AtomicInteger
我是一名优秀的程序员,十分优秀!