【发布时间】:2010-03-15 14:57:52
【问题描述】:
我需要一个 long 类型的计数器,具有以下要求/事实:
- 递增计数器应该花费尽可能少的时间。
- 计数器只能由一个线程写入。
- 从计数器读取将在另一个线程中完成。
- 计数器会定期递增(每秒最多几千次),但每五秒只会读取一次。
- 精确的准确性并不重要,只需粗略了解计数器的大小就足够了。
- 计数器永远不会被清除,会递减。
根据这些要求,您会选择如何实施您的计数器?作为简单的long,作为volatile long 还是使用AtomicLong?为什么?
目前我有一个volatile long,但想知道另一种方法是否会更好。我还通过 ++counter 而不是 counter++ 来增加我的多头。因为没有完成任务,这真的更有效吗(正如我在其他地方被引导相信的那样)?
【问题讨论】:
-
volatile 应该没问题,因为合约规定对 volatile 变量的每次读取都发生在先前写入的锁定释放之后。
-
如果您每秒只更新几千次并使用非嵌入式处理器,则差异无关紧要;如今,您可以在几乎任何机器上每秒进行数百万次
AtomicLong更新。不过,我同意volatile应该足够了。如果您想确定的话,您可以同时对两者进行编码并检查它们匹配的频率(以及它们何时不匹配)。 -
@Riduidel 我们正在计算传入的数据包,我并不介意这个数字是 12,345,678 还是稍晚于 12,345,602
标签: java performance java.util.concurrent