Java:有没有AtomicFloat或AtomicDouble?
2022-08-31 15:37:36
我找到了 , ,但是 (或 ) 在哪里?也许有一些技巧?AtomicInteger
AtomicLong
AtomicFloat
AtomicDouble
我找到了 , ,但是 (或 ) 在哪里?也许有一些技巧?AtomicInteger
AtomicLong
AtomicFloat
AtomicDouble
java.util.concurrent
包的 API 文档声明如下:
[...]此外,仅为在预期应用程序中通常有用的那些类型提供了类。例如,没有用于表示字节的原子类。在那些不常见的情况下,您可以使用
AtomicInteger
来保存字节值,并进行适当的强制转换。您还可以使用Float.floatToIntBits
和Float.intBitstoFloat
转换来保持浮点数,并使用Double.doubleToLongBits
和Double.longBitsToDouble
转换来保持浮点数。
我并不是说这是一个方便的解决方案,但这似乎是解释。我想你可能想要包装一个,并为/ etc提供访问方法。AtomicInteger
getFloat
setFloat
我实际上四处写了一个。给你:
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(); }
}
您也许可以改用 。我想并得到特殊的课程,因为它们对计数有用。AtomicReference<Float>
AtomicInteger
AtomicLong