gpt4 book ai didi

java - Long primitive 还是 AtomicLong 作为计数器?

转载 作者:太空狗 更新时间:2023-10-29 22:35:09 24 4
gpt4 key购买 nike

我需要一个 long 类型的计数器,具有以下要求/事实:

  • 增加计数器的时间应尽可能短。
  • 计数器只会被一个线程写入。
  • 从计数器读取将在另一个线程中完成。
  • 计数器会定期递增(最多每秒几千次),但只会每五秒读取一次。
  • 精确度并不重要,只要大致了解计数器的大小就足够了。
  • 计数器永远不会被清零、递减。

根据这些要求,您会选择如何实现您的计数器?作为一个简单的 long,作为一个 volatile long 还是使用一个 AtomicLong?为什么?

目前我有一个 volatile long 但想知道另一种方法是否会更好。我还通过执行 ++counter 而不是 counter++ 来增加我的 long。这真的更有效吗(正如我在其他地方被引导相信的那样)因为没有完成任务?

最佳答案

鉴于这些要求,我认为 volatile long 应该足够了。对于非 volatile 长,计数器不会不正确,但在这种情况下,读者可能正在读取陈旧的信息。

一个问题是对long 的读写是not required to be atomic , 通过 JVM specification如果它没有被声明为 volatile。这意味着如果读取线程在写入线程更新值的一部分而不是另一部分时读取该值,则它可能会获得一个相当虚构的值。

++countercounter++ 之间的区别可能无关紧要,因为 JVM 会意识到表达式的值没有被使用任何更多,在这种情况下两者是等价的。

关于java - Long primitive 还是 AtomicLong 作为计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com