可以在非并发Web应用程序中使用AtomicInteger而不是整数吗?

时间:2017-07-21 11:09:01

标签: java atomicinteger

在某些任意Java代码而不是AtomicInteger中使用Integer是否有意义?即使在单线程环境中,线程安全也不是问题?

这会以任何方式帮助提高绩效吗?

1 个答案:

答案 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对象。