添加原子双打

时间:2012-03-26 15:08:57

标签: java double atomic

atomics package summary末尾有一条说明:

  

...您也可以使用floatsFloat.floatToIntBits次转化Float.intBitstoFloatdoubles使用Double.doubleToLongBitsDouble.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

1 个答案:

答案 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工作。