7

Java 提供了 AtomicIntegerAtomicLong,它们基本上编译成 CAS硬件级别的指令。short但是为什么对于其他原始类型(如和)不存在这样的 AtomicXXXfloatdouble

4

3 回答 3

5

你不能在不到一个字的情况下进行 CAS。AtomicBoolean 使用 an 实现,int并且float可以使用 anintdouble使用 a实现long

AFAIK,这些是作为 Doug Lea 的并发库的一部分添加的,以前没有足够的需要拥有这些类型的 Atmoic 版本。

恕我直言,AtomicDouble 可能很有用,但float由于缺乏精度,我尽可能避免使用。

于 2013-09-18T17:44:41.660 回答
0

原始类型太多了:)

如果 Java 支持原始类型的泛型,我们可以Atomic<short>为所有原始类型提供等。

没有它,我们必须为每个 Xxx 原始类型声明 AtomicXxx。API 设计人员可能会觉得这没有吸引力。

Java8 中也会发生同样的事情。我们有一个通用的Function<A,B>. 但是出于性能方面的原因,我们希望有 的原始版本Function,所以我们有IntFunction一种Function<int,B>. 但这仅适用于int, long, double. 没有ShortFunction等。他们有太多的“原始化”类型 [1] 并且他们厌倦了它,所以他们停在这 3 种类型上。

[1] http://download.java.net/jdk8/docs/api/java/util/function/package-summary.html

另见布赖恩的回答: http: //mail.openjdk.java.net/pipermail/lambda-dev/2013-March/008535.html

于 2013-09-18T18:00:34.913 回答
0

将 AtomicInteger 设置为一个值非常容易。假设您希望它是一个短片。您可以将 AtomicInteger 包装到您的自定义类型中,并使用模运算来限制该值。达到最大值后,该值会以与原始 AtomicInteger 实现中的 Integer.MAX 值相同的方式被回收。

public class AtomicShort
{
  private AtomicInteger root = new AtomicInteger();

  public short incrementAndGet()
  {
    return (short) (root.incrementAndGet() % Short.MAX);
  }
}
于 2017-11-22T11:04:15.357 回答