您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java:没有AtomicFloat或AtomicDouble吗?

Java:没有AtomicFloat或AtomicDouble吗?

java.util.concurrent程序包api文档规定以下内容

[…]此外,仅为在预期应用程序中通常有用的那些类型提供类。 例如,没有用于表示字节的原子类。如果您不希望这样做,可以使用anAtomicInteger来保存字节值,并进行适当的转换。

我并不是说这是一个方便的解决方案,但这似乎是一种解释。我想您可能想包装AtomicInteger和为getFloat/ setFloatetc 提供访问方法

我实际上写了一篇。干得好:

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();          }

}
java 2022/1/1 18:14:01 有495人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶