atomics package summary末尾有一条说明:
...您也可以使用
floats
和Float.floatToIntBits
次转化Float.intBitstoFloat
,doubles
使用Double.doubleToLongBits
和Double.longBitsToDouble
次转化。< / p>
显然,你不能只将这些值加在一起,那么addAndGet
值的原子double
等价。
private AtomicLong sum = new AtomicLong();
...
// This would almost certainly NOT work.
public long add(double n) {
return sum.addAndGet(Double.doubleToLongBits(n));
}
你可以假设我很努力不使用synchronized
。
答案 0 :(得分:4)
Guava提供AtomicDouble
,使用它可能是最简单的事情,而不是自己滚动......
也就是说,它在内部使用AtomicLong
的包装器实现,您可以看到addAndGet
here的实现;它基本上是
while (true) {
long current = value;
double currentVal = longBitsToDouble(current);
double nextVal = currentVal + delta;
long next = doubleToRawLongBits(nextVal);
if (updater.compareAndSet(this, current, next)) {
return nextVal;
}
}
这是实现它而不处理装配的唯一方法。
完全披露:我在Guava工作。