Существует примечание в конце atomics package summary, который гласит:Добавить атомные двойники
... Вы можете также провести
floats
с помощьюFloat.floatToIntBits
иFloat.intBitstoFloat
переходов иdoubles
с использованиемDouble.doubleToLongBits
иDouble.longBitsToDouble
преобразования.
Очевидно, что вы не можете просто добавить эти значения вместе с тем, что было бы равносильно атомной 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
.
Ах да! Я вижу, как это будет единственным способом, не перейдя на JNI и ассемблер. Не могли бы вы разместить решение здесь в качестве кода для полноты, пожалуйста? Просто «addAndGet» будет достаточно. – OldCurmudgeon
Решение опубликовано. –
Хотя голодание может быть проблемой в теории здесь, я думаю, это на самом деле не происходит на практике. – biziclop