Java 提供了 AtomicInteger
等AtomicLong
,它们基本上编译成 CAS
硬件级别的指令。short
但是为什么对于其他原始类型(如和)不存在这样的 AtomicXXXfloat
类double
?
3 回答
你不能在不到一个字的情况下进行 CAS。AtomicBoolean 使用 an 实现,int
并且float
可以使用 anint
和double
使用 a实现long
。
AFAIK,这些是作为 Doug Lea 的并发库的一部分添加的,以前没有足够的需要拥有这些类型的 Atmoic 版本。
恕我直言,AtomicDouble 可能很有用,但float
由于缺乏精度,我尽可能避免使用。
原始类型太多了:)
如果 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
将 AtomicInteger 设置为一个值非常容易。假设您希望它是一个短片。您可以将 AtomicInteger 包装到您的自定义类型中,并使用模运算来限制该值。达到最大值后,该值会以与原始 AtomicInteger 实现中的 Integer.MAX 值相同的方式被回收。
public class AtomicShort
{
private AtomicInteger root = new AtomicInteger();
public short incrementAndGet()
{
return (short) (root.incrementAndGet() % Short.MAX);
}
}