-5

AtomicInteger在一些任意的 Java 代码中使用而不是在Integer. 即使在单线程上下文中,线程安全也不是问题?

这会对性能有任何帮助吗?

4

1 回答 1

2

否:整数是一个有点特殊的类。例如,编译器知道如何将 int 自动装箱为 Integer,将 Integer 自动装箱为 int。

是的:两个类都代表整数。它们都扩展了 Number 类。当然,您可以使用 AtomicInteger 作为 Integer 的替代品。

但是:请记住,它AtomicInteger只是具有普通整数所没有的特殊属性。这些特殊能力不是免费的。因此,盲目地这样做可能会导致 非常实际的性能损失。

当然:你不写源代码是因为你可以. 您努力准确地编写解决某个问题所需的源代码。含义:在需要时使用 int 原始类型;您在必要时使用 Integer 对象,在问题陈述需要时使用 AtomicInteger。

换句话说:当你去打猎时,你会选择一把霰弹枪。当然,你也可以使用突击步枪(最终都是枪)。只是不同的工具有不同的使用场景,你选择适合工作的工具。

除此之外,你会得到错误的表现。完全错误。您的评论暗示您认为:“AtomicIntegers 是可变的;Integers 不是”......所以我猜你的结论是:它们的性能更好。

您忘记了:它们不仅是可变的,而且还保证原子行为。并猜测这是如何实现的:A)通过使用 com.misc.Unsafe 和 B)private volatile int value;

含义:AtomicInteger 有一个volatile字段。每个和任何更新都写入存储器。你知道写入内存需要多长时间吗

可能不是 - 那么让我们看看:

L1 缓存引用 1 秒

分支错误预测 10 秒

L2 缓存参考 14 秒

主内存参考 3.3 分钟

来源

我只使用了最后一列——它可以扩展到人类可以理解的度量。

含义:进入 L1 缓存需要1 秒- 表格告诉您转向内存需要3 分钟

因此,您通过使用“可变”类来提高性能的想法会造成 180 倍的性能损失。

长话短说:

长话短说:在遇到真正的问题(例如测试人员/客户抱怨某项功能需要很长时间)之前,人们不会担心性能。然后你开始调查。您进行分析以了解究竟是什么导致了性能问题。然后你修复它。当然,你避免犯完全愚蠢的错误。在您的情况下:当您的程序必须对整数进行如此密集的计算以致您担心性能时,答案很简单:那么您将使用原始类型int值;并首先完全避免引用类型 Integer 对象。

于 2017-07-21T11:26:12.043 回答