- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
LongAdder
作为 AtomicLong
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0, 1000)
.forEach(i -> executor.submit(adder::increment));
stop(executor);
System.out.println(adder.sumThenReset()); // => 1000
LongAccumulator
是 LongAdder
LongBinaryOperator op = (x, y) -> 2 * x + y;
LongAccumulator accumulator = new LongAccumulator(op, 1L);
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0, 10)
.forEach(i -> executor.submit(() -> accumulator.accumulate(i)));
stop(executor);
System.out.println(accumulator.getThenReset()); // => 2539
我有一些疑问。
LongAdder
总是优先于 AtomicLong 吗?LongAccumulator
是否优于 LongAdder 和 AtomicLong?最佳答案
Javadoc 中提到了这些类之间的区别,以及何时使用一个而不是另一个。来自 LongAdder
:
This class is usually preferable to
AtomicLong
when multiple threads update a common sum that is used for purposes such as collecting statistics, not for fine-grained synchronization control. Under low update contention, the two classes have similar characteristics. But under high contention, expected throughput of this class is significantly higher, at the expense of higher space consumption.
来自LongAccumulator
:
This class is usually preferable to
AtomicLong
when multiple threads update a common value that is used for purposes such as collecting statistics, not for fine-grained synchronization control. Under low update contention, the two classes have similar characteristics. But under high contention, expected throughput of this class is significantly higher, at the expense of higher space consumption.[...]
Class
LongAdder
provides analogs of the functionality of this class for the common special case of maintaining counts and sums. The callnew LongAdder()
is equivalent tonew LongAccumulator((x, y) -> x + y, 0L)
.
因此,使用其中一个取决于您的应用程序打算做什么。它并不总是严格首选,只有在期望高并发并且您需要维护公共(public)状态时才使用。
关于java 8 : Are LongAdder and LongAccumulator preferred to AtomicLong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35688862/
我正在创建一个程序来创建斐波那契数列,但它总是搞砸,因为多头不能包含它很长时间。我正在尝试切换到 AtomicLongs,但我无法将atomiclong 添加到atomiclong,只能添加常规lon
我知道可能的竞争条件是读取-修改-写入,例如: public class UnsafeSequence { private int value; public int getNex
所以我在使用 AtomicLong 并决定看一下它的实现,并注意到两种方法之间的以下区别: getAndAdd(long delta): public final long getAndAdd(lon
我正在开发多线程代码,我试图测量特定方法所花费的时间,因为我正在对我们的客户端代码和服务代码进行负载和性能测试,并尝试对我们的大多数队友代码进行基准测试。 因此,对于此性能测量,我使用 - Syste
我不能递减流中的公共(public)长值(流中使用的外部声明值必须是最终值),所以我必须在 java 流中使用 AtomicLong: var users = Stream getUsers(); v
我有一个非常简单的类(class): public class IdProvider { private Map idMap; public IdProvider(){
我需要一个长实例变量。 此变量将保存一些事件时间(以毫秒为单位的时间)。 如果我只是将值设置为这么长并获取值, 使用 AtomicLong(并且只使用它的 get() 和 set())而不是 long
我有一个运行多线程的程序,所有线程共享并处理单个 AtomicLong 变量。他们每个人都会首先调用 getAndAdd() 方法来检索值并进一步处理。 如果所有线程同时运行,调用上述方法是否会导致一
我了解了 Java 的 AtomicInteger 在内部如何与 CAS(比较和交换)操作一起工作。基本上,当多个线程尝试更新值时,JVM 内部会使用底层 CAS 机制并尝试更新值。如果更新失败,则使
我在我的多线程代码中使用 AtomicLong 的 incrementAndGet 方法来测量我们的一些客户端代码的性能。 @Override public void run() { long
我有一张 map 如下 - ConcurrentHashMap histogram = new ConcurrentHashMap(); 这张 map 包含很多键值对。将 AtomicLong 作为值
上下文:我正在使用 netty 并定义了一个处理程序,以便对传入/传出流量进行计数和分类。为此,我使用了如下所示的 enumMap: EnumMap 但是现在我意识到只有一个线程在操作值(之前我认为它
我看到 Java 的 AtomicInteger 在内部如何与 CAS(比较和交换)操作一起工作。基本上当多个线程尝试更新值时,JVM 在内部使用底层 CAS 机制并尝试更新值。如果更新失败,则使用新
有人能解释一下 AtomicLong 的用途吗?例如,下面的语句有什么区别? private Long transactionId; private AtomicLong transactionId;
下面这段代码中的原子整数是否在不同的 REST 调用之间共享?如果它是静态的呢? public class GreetingController { private static final
我正在尝试将一些 Java 代码移植到 Windows C++,但对如何实现 AtomicLong.lazySet() 感到困惑。我能找到的唯一信息是谈论它的作用,而不是如何实现它,可用的源代码最终在
LongAdder 作为 AtomicLong 的替代品 ExecutorService executor = Executors.newFixedThreadPool(2); IntStrea
我需要一个 long 类型的计数器,具有以下要求/事实: 增加计数器的时间应尽可能短。 计数器只会被一个线程写入。 从计数器读取将在另一个线程中完成。 计数器会定期递增(最多每秒几千次),但只会每五秒
我需要一个具有 AtomicLong 值的多键映射。所以类似于 AtomicLongMap 的东西guava 但它支持多个键。所以我的新 map 应该能够像这样: MultiKeyAtomicLong
我希望将 AtomicLong 中的当前 timestamp 与 currentTimeMS 进行比较,以便我知道是否已经过去了一段时间,如果是,则只有一个单线程将进入一个代码块,但据我所知,comp
我是一名优秀的程序员,十分优秀!