2012-03-26 76 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