Java 在非并发web应用程序中是否可以使用AtomicInteger而不是integer?

Java 在非并发web应用程序中是否可以使用AtomicInteger而不是integer?,java,atomicinteger,Java,Atomicinteger,在一些任意Java代码中使用AtomicInteger而不是Integer有意义吗?即使在单线程环境中,线程安全也不是问题 这对性能有什么帮助吗?否:Integer是一个有点特殊的类。例如,编译器知道如何将int自动装箱到Integer和Integer自动装箱到int 是:两个类都代表整数。它们都扩展了Number类。当然,您可以使用AtomicInteger替换Integer 但是:请记住,AtomicInteger只是具有普通整数所没有的特殊属性。这些特殊能力不是免费提供的。因此,盲目地这样

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


这对性能有什么帮助吗?

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

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

但是:请记住,
AtomicInteger
只是具有普通整数所没有的特殊属性。这些特殊能力不是免费提供的。因此,盲目地这样做可能会带来潜在的、非常真实的性能损失

当然,你不会写源代码,因为你可以。您努力准确地编写解决特定问题所需的源代码。意思是:需要时使用int基元类型;必要时可以使用Integer对象,问题语句需要时可以使用AtomicInteger

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

除此之外,您的性能也有问题。完全错误。您的评论暗示您认为:“原子整数是可变的;整数不是”。。。所以我猜你的结论是:他们的表现更好

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

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

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

一级缓存引用1秒

分支预测失误10秒

二级缓存引用14秒

主存储器参考3.3分钟

()

我只使用了最后一个专栏,这个专栏以人类可以理解的尺度来衡量

含义:当转到一级缓存时需要1秒-该表告诉您转到内存需要3分钟

因此,您使用“可变”类来提高性能的想法会导致180倍的性能损失

长话短说:

  • 当您考虑性能时-对不起,您必须了解从上到下的完整的堆栈

长话短说:只有在遇到真正的问题(比如测试人员/客户抱怨某个函数需要花费很多时间)时,才会担心性能。然后你开始调查。您需要进行分析以了解性能问题的确切原因。那你就把它修好。当然,你要避免犯完全愚蠢的错误。在您的例子中:当您的程序必须对整数进行密集计算,以至于您担心性能时,答案很简单:然后您将使用primitive typeint值;首先要完全避免引用类型的整数对象。

为什么你认为你不能这样做?是的,可以。没有理由不起作用。试试看,TBH。或者,如果你问的是性能、清晰度之类的问题,请在你的问题中精确地回答。我的回答中有任何反馈,比如-为了让它值得接受,是否缺少了一些东西?AtomicInteger是可变的,Integer是不变的。可变对象不应该执行得更快吗!?