java - 添加原子 double

标签 java double atomic

atomics package summary 末尾有注释指出:

... You can also hold floats using Float.floatToIntBits and Float.intBitstoFloat conversions, and doubles using Double.doubleToLongBits and Double.longBitsToDouble conversions.

显然,您不能将这些值简单地加在一起,所以什么相当于 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

最佳答案

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

关于java - 添加原子 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9874676/

相关文章:

java - 在什么情况下需要将 volatile 关键字与 Atomic 字段一起使用?

java - Spring boot Service类中出现空指针异常

java - 是否可以限制 Java 小程序使用的虚拟内存量?

c - 将节点添加到双链表

c++ - 关于 float 舍入错误

c# - 在 C# 中将未知的 long\int\short 转换为 double

c++ - sig_atomic_t 和 std::atomic<> 可以互换吗?

java - 如何在 Eclipse Luna 中获取旧颜色主题?

java - 检查 .class 文件中类的包名和类名的工具

java - AtomicInteger.compareAndSet 返回原始值,而不是 boolean 值