Java AtomicInteger
提供public final boolean compareAndSet(int expect, int update)
。如果返回false
,我想知道比较失败时实际值是多少。这在Java中是否可行?
在.Net中,有public static int CompareExchange(ref int location1, int value, int comparand)
,它始终返回原始值。
答案 0 :(得分:1)
public int getAndCompareAndSet(AtomicInteger ai, int expected, int update) {
while (true) {
int old = ai.get();
if (old != expected) {
return old;
} else if (ai.compareAndSet(old, update)) {
return old;
}
}
}
(这种循环是AtomicInteger
上大多数操作的实现方式:get循环,做一些逻辑,尝试比较和设置。)
答案 1 :(得分:0)
API不公开这样的方法。更重要的是,Oracle实现使用sun.misc.Unsafe
来执行本机CAS操作,并且该类型也不会公开它。
如果get()
返回compareAndSet
,则只需拨打false
即可。但是,当您检查它时,AtomicInteger
的实际值可能已更改。你用它做的并不多。对于Interlocked
方法也是如此。你必须澄清你想用这个值做什么才能继续下去。