在某些任意Java代码而不是AtomicInteger
中使用Integer
是否有意义?即使在单线程环境中,线程安全也不是问题?
这会以任何方式帮助提高绩效吗?
答案 0 :(得分:2)
否:整数是一个有点特殊的类。例如,编译器知道如何将Integer和Integer的int自动设置为int。
是:这两个类代表整数。它们都扩展了Number类。当然,您可以使用AtomicInteger替换Integer。
但是:请记住AtomicInteger
只有普通整数所没有的特殊属性。这些特殊能力不免费提供。因此盲目地执行潜在 非常真实的性能惩罚。
当然:您不会编写源代码,因为可以。您努力编写解决某个问题所需的源代码。含义:在需要时使用int基本类型;在必要时使用Integer对象,在问题语句需要时使用AtomicInteger。
换句话说:当你去寻找猎鸭时,你会选择一把猎枪。当然,你也可以使用突击步枪(两者都是枪支)。只是不同的工具有不同的使用场景,你选择 best 适合工作的工具。
除此之外,您的性能错误。完全错了。你的评论意味着你认为:" AtomicIntegers是可变的;整数不是" ...所以我猜你的结论是:他们的表现更好。
你忘记了什么:它们不仅是可变的,它们还保证原子行为。并猜测如何实现:A)使用com.misc.Unsafe和B)private volatile int value;
含义:AtomicInteger有一个易失性字段。每个更新都会写入主内存。你有任何想法写入内存需要多长时间?!
可能不是 - 然后让我们看看:
L1缓存参考1秒
分支误预测10秒
L2缓存参考14秒
主内存参考3.3分钟
(source)
我只使用了最后一栏 - 它可以扩展到人类可以理解的措施。
含义:当进入L1缓存需要花费 1秒时 - 该表告诉您转向内存成本 3分钟。
因此,通过使用" mutable" 提高性能的想法class给出180次性能惩罚。
长话短说:
长话短说:在一个人遇到真正的问题之前,一个人不担心性能(比如测试人员/客户在某个功能上抱怨需要花费很多时间)。然后你开始调查。您执行分析以了解导致性能问题的确切原因。然后你修复它。当然,你避免犯下彻头彻尾的愚蠢错误。在你的情况下:当你的程序必须对整个数字进行密集计算时,你担心性能,答案很简单:那么你将使用原始类型 int 值;并且首先完全避免引用类型的Integer对象。