我正在读Cay S. Horstmann写的"Core Java“这本书,在第580页他提到了LongAdder
如果您预期会有很高的争用*1,那么您应该简单地使用LongAdder而不是AtomicLong。方法名称略有不同。调用increment递增计数器或调用add递增数量,调用sum检索总数。
当然,请注意,增量方法不会返回旧的*2值。这样做将取消将和拆分为多个求和器的效率增益。
在*1中的“争用”这个词,我假设他的意思是机器的第二个严重过载,有很多线程运行java代码。
在*2中,他提到了旧的价值。在这种情况下,新旧事物的价值是什么?你能简要解释一下吗?
发布于 2021-02-27 20:55:21
*1:多线程上下文中的术语“争用”意味着许多线程试图同时访问/调用/更新某些东西;在这种情况下,通常是LongAdder或计数器。
*2:此上下文中的旧值为LongAdder的前一个值。除了set和一些CAS方法之外,AtomicLong的所有更新方法都返回存储的前一个值,而LongAdder#increment返回void。新值就是..新的值,您可以通过sum获取的值。
类LongAdder的工作方式与AtomicLong不同,这就是为什么increment不返回任何东西的原因。您可以在这里阅读: LongAdder的性能如何优于AtomicLong
发布于 2021-02-27 20:56:45
LongAdder没有维护一个值。当您递增/添加新值时,它将1或新值存储在不同的单元格中。它不能保持总价值。
当你想得到实际的值时,你可以调用sum()方法,它会将所有的值相加得到结果。
为了更好地理解,下面是如何在LongAdder中实现sum方法:
https://stackoverflow.com/questions/66398853
复制相似问题