2012-03-26 81 views
3

有一个在atomics package summary的最后一张纸条,上面规定:添加原子双打

...您也可以使用Float.floatToIntBitsFloat.intBitstoFloat转换,以及doubles使用Double.doubleToLongBitsDouble.longBitsToDouble转换持有floats

显然,你不能只是添加这些值在一起,因此这将是相当于原子addAndGetdouble值。

private AtomicLong sum = new AtomicLong(); 
... 
// This would almost certainly NOT work. 
public long add(double n) { 
    return sum.addAndGet(Double.doubleToLongBits(n)); 
} 

你可以假设我很努力地不使用​​。

回答

4

番石榴提供AtomicDouble,并使用这可能是做,而不是你自己的滚动它最简单的事情......

这就是说,它在内部与周围AtomicLong的包装来实现,你可以看到他们实施addAndGethere;它基本上是

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; 
    } 
} 

这是真正的唯一方法来做到这一点,而无需处理程序集。

完全披露:我在番石榴工作。

+0

啊是的!我可以看到,如果不使用JNI和汇编器,这将是唯一的方法。您能否将解决方案发布为完整性代码?只要addAndGet就足够了。 – OldCurmudgeon 2012-03-26 15:17:49

+0

已发布解决方案。 – 2012-03-26 15:20:46

+0

尽管饥饿在理论上可能成为一个问题,但我猜这在实践中并不真正发生。 – biziclop 2012-03-26 15:22:45