Java:有没有AtomicFloat或AtomicDouble?

2022-08-31 15:37:36

我找到了 , ,但是 (或 ) 在哪里?也许有一些技巧?AtomicIntegerAtomicLongAtomicFloatAtomicDouble


答案 1

java.util.concurrent的 API 文档声明如下:

[...]此外,仅为在预期应用程序中通常有用的那些类型提供了类。例如,没有用于表示字节的原子类。在那些不常见的情况下,您可以使用 AtomicInteger 来保存字节值,并进行适当的强制转换。您还可以使用 Float.floatToIntBitsFloat.intBitstoFloat 转换来保持浮点数,并使用 Double.doubleToLongBitsDouble.longBitsToDouble 转换来保持浮点数。

我并不是说这是一个方便的解决方案,但这似乎是解释。我想你可能想要包装一个,并为/ etc提供访问方法。AtomicIntegergetFloatsetFloat


我实际上四处写了一个。给你:

import java.util.concurrent.atomic.AtomicInteger;
import static java.lang.Float.*;

class AtomicFloat extends Number {

    private AtomicInteger bits;

    public AtomicFloat() {
        this(0f);
    }

    public AtomicFloat(float initialValue) {
        bits = new AtomicInteger(floatToIntBits(initialValue));
    }

    public final boolean compareAndSet(float expect, float update) {
        return bits.compareAndSet(floatToIntBits(expect),
                                  floatToIntBits(update));
    }

    public final void set(float newValue) {
        bits.set(floatToIntBits(newValue));
    }

    public final float get() {
        return intBitsToFloat(bits.get());
    }

    public float floatValue() {
        return get();
    }

    public final float getAndSet(float newValue) {
        return intBitsToFloat(bits.getAndSet(floatToIntBits(newValue)));
    }

    public final boolean weakCompareAndSet(float expect, float update) {
        return bits.weakCompareAndSet(floatToIntBits(expect),
                                      floatToIntBits(update));
    }

    public double doubleValue() { return (double) floatValue(); }
    public int intValue()       { return (int) get();           }
    public long longValue()     { return (long) get();          }

}

答案 2

您也许可以改用 。我想并得到特殊的课程,因为它们对计数有用。AtomicReference<Float>AtomicIntegerAtomicLong


推荐