这是来自的代码片段AtomicInteger:
public final int accumulateAndGet(int x,
IntBinaryOperator accumulatorFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = accumulatorFunction.applyAsInt(prev, x);
if (weakCompareAndSetVolatile(prev, next))
return next;
haveNext = (prev == (prev = get()));
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何特定原因使用for(...而不是while(...或者它只是一个编程选择?
是因为jvm进行了重新排序吗?
class MyCls implements Cloneable {
@Override
protected MyCls clone() throws CloneNotSupportedException {
return new MyCls(//...
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有任何问题。那么为什么CopyOnWriteArrayList#clone返回一个Object而不是CopyOnWriteArrayList?从转换回Object所需类型时,编译器会哭。毕竟,这个设计决定的原因是什么?我看到整个图书馆都在重复这种模式。
Ralph建议下面的代码是有效的,而不是上面的代码:
@Override MyCls clone() throws CloneNotSupportedException {
MyCls clone = (MyCls)super.clone();
clone.x = this.x; //or what ever to do return clone
// ...
}
Run Code Online (Sandbox Code Playgroud)
问题还是一样。为什么CopyOnWriteArrayList#clone返回Object而不是它自己?
这是 Java 库中的一个片段:
public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newValue) {
return (int)VALUE.compareAndExchangeAcquire(this,
(expectedValue ? 1 : 0),
(newValue ? 1 : 0)) != 0;
}
Run Code Online (Sandbox Code Playgroud)
它来自AtomicBoolean课堂。演员怎么能int返回一个boolean?
我的主要问题:compareAndExchangevs之间有什么区别compareAndExchangeAcquire?
通俗地说:在申请之前xxxAcquire和之后写的语句xxxRelease可以自由重新排序xxx。