需要同步增量计数器?

Posted

技术标签:

【中文标题】需要同步增量计数器?【英文标题】:Need synchronization for an increment-only counter? 【发布时间】:2011-11-30 13:39:40 【问题描述】:

我使用整数作为计数器。整数只会增加,而且肯定不止一个线程会同时增加它。该计数器的值在程序执行结束时读取,此时没有其他线程将尝试访问其值。

我假设我不必为这种仅增量计数器使用锁或任何类型的同步。这是正确的吗? 如果这有什么不同,我会用 Java 编写代码。

【问题讨论】:

【参考方案1】:

如果您只使用了intlong 变量,那么您需要同步 - 递增涉及读/本地递增/写入,这远非原子操作。 (即使变量是 volatile 以避免内存模型过时问题,您仍然需要三个不同的操作,并且有可能在任何对之间被抢占。)

幸运的是,Java 提供了AtomicIntegerAtomicLong,它们可以在没有任何同步的情况下使用:

private final AtomicLong counter = new AtomicLong();

...

counter.incrementAndGet(); // No need for synchronization

【讨论】:

像往常一样,Jon skeet 的回答很棒。乔恩你也写过任何关于 Java 编程的书吗,如果有,请告诉我:) 其他书籍的推荐也将不胜感激 @JavaSa:不,我还没有写任何关于 Java 的东西。不过,我会彻底推荐 Josh Bloch 的 Effective Java。 谢谢,您是否还有免费的书籍建议来介绍自 2005 年以来 Java 中的新功能?让我们说 Java 7,也许是 Java 8 @JavaSa:不,恐怕我已经很久没有真正阅读任何 Java 书籍了...... 另见docs.oracle.com/javase/tutorial/essential/concurrency/…

以上是关于需要同步增量计数器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery Ui 滑块中添加自定义增量和减量计数器

屏障同步(输出、增量和等待)

HBase 模式行键设计 - 增量计数器?

MySQL SELECT 增量计数器

带循环的增量计数器

Firebase 的云函数:增量计数器