当前位置: 首页 > 面试题库 >

Java:没有AtomicFloat或AtomicDouble吗?

羿易安
2023-03-14
问题内容

我已经找到了AtomicInteger,,AtomicLong但是AtomicFloat(或AtomicDouble)在哪里?也许有一些窍门?


问题答案:

java.util.concurrent程序包的API文档规定以下内容:

[…]此外,仅为在预期应用程序中通常有用的那些类型提供类。 例如,没有用于表示字节的原子类。如果您不希望这样做,可以使用an
AtomicInteger来保存字节值,并进行适当的转换。
您还可以使用Float.floatToIntBitsFloat.intBitstoFloat转换来保存浮点数,并使用Double.doubleToLongBitsDouble.longBitsToDouble转换来保留双精度数。

我并不是说这是一个方便的解决方案,但这似乎是一种解释。我想您可能想包装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();          }

}


 类似资料:
  • 问题内容: 内容: 我想说的是: 问题答案: 一种方法是手动处理此问题: 使用包装(扩展) 只要设置了值,就保留()线程和值 或者,通过一些反射(和),您可以: 呼叫 调用(针对上述每个线程) 呼叫 第一是更优选的。

  • 问题内容: 我可以通过将L附加到值来创建文字。为什么我不能以类似的方式创建字面量的short或byte?为什么我需要在转换时使用int文字? 如果答案是“因为C中没有短文字”,那么为什么C中没有短文字? 这实际上并没有以任何有意义的方式影响我的生活;写(短)0而不是0S很简单。但是这种矛盾使我感到好奇。这是当您深夜起床时困扰您的事情之一。有人在某个时候做出了设计决定,使得可以为某些原始类型输入文字

  • 我正在尝试使用BatchGetItem从DynamoDB获取项目。我在两个表中搜索。这就是我下面的例子。获取项目是否必须使用哈希键和范围键?我想使用不是散列键或范围键的属性进行获取。这是否可以使用BatchGetItem?或者我们可以使用索引属性进行获取吗? 提前谢谢。

  • 问题内容: 在进行了整个“企业”编程一段时间之后,我对语言本身感到非常失望,如果不得不回到它上面,总是会感到很受阻。您平均的Android应用程序的项目规模并不太令人生畏,并且库的编码风格实际上非常不错,但是如果我可以避免使用Java,我肯定会这样做。 这就是问题:我可以避免吗?尽管有很多JVM语言可以在台式机和服务器上选择,但是Dalvik VM和设备本身存在一些限制。使用JIT在2.2中似乎更

  • 问题内容: 我试图在Mac OS X EL Captain 10.11上使用Java 1.7 SDK和Hadoop2.7.1运行一个简单的单词计数MapReduce程序,并且在我的容器日志“ stderr” / bin / bash中得到以下错误消息:/ bin / java:无此文件或目录 应用日志 命令我正在运行 我的ENV变量是- 问题似乎是因为YARN对JAVA可执行文件使用的路径与您在O

  • 问题内容: 我正在尝试让Eclipse v3.5(Galileo)在我的计算机上重新运行-以前我没有任何问题地运行过它,但是现在我仍然遇到此错误: Java运行时环境(JRE)或Java开发工具包(JDK)必须可用才能运行Eclipse。搜索以下位置后未找到Java虚拟机:当前路径中的C:\ eclipse \ jre \ javaw.exe 我刚刚完成了JDK和SDK的全新安装。 我有Windo