2012-03-26 3 views
3

내용의 atomics package summary의 끝에 주석이 추가원자 복식

을 ... 당신은 또한 Double.doubleToLongBitsDouble.longBitsToDouble 변환을 사용하여 Float.floatToIntBitsFloat.intBitstoFloat 변환 및 doubles를 사용하여 floats를 보유 할 수 있습니다.

은 분명히 당신은 단지 double 값에 대한 원자 addAndGet에 함께 때문에 해당 일 것입니다 무슨이 값을 추가 할 수 없습니다.

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

synchronized을 사용하지 않으려 고 할 수 있습니다.

답변

4

, 그것은 내부적으로 래퍼 주위 AtomicLong로 구현 말했습니다

, 당신은 addAndGet의 구현을 볼 수 있습니다 ... 구아바는 AtomicDouble을 제공하며, 사용이 아마 오히려 직접 압연보다, 할 수있는 간단한 일이 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; 
    } 
} 

입니다. 이것은 조립을 처리하지 않고 실제로 할 수있는 유일한 방법입니다.

전체 공개 : 저는 구아바에서 일합니다.

+0

아! 예! JNI와 어셈블러 없이는 이것이 어떻게 유일한 방법인지 알 수 있습니다. 완전성을 위해 코드를 여기에 게시 할 수 있습니까? 'addAndGet'만으로 충분합니다. – OldCurmudgeon

+0

솔루션이 게시되었습니다. –

+0

굶주림은 이론상 문제가 될 수 있지만 실제로는 실제로 발생하지 않는다고 생각합니다. – biziclop