需要同步增量计数器?
Posted
技术标签:
【中文标题】需要同步增量计数器?【英文标题】:Need synchronization for an increment-only counter? 【发布时间】:2011-11-30 13:39:40 【问题描述】:我使用整数作为计数器。整数只会增加,而且肯定不止一个线程会同时增加它。该计数器的值在程序执行结束时读取,此时没有其他线程将尝试访问其值。
我假设我不必为这种仅增量计数器使用锁或任何类型的同步。这是正确的吗? 如果这有什么不同,我会用 Java 编写代码。
【问题讨论】:
【参考方案1】:如果您只使用了int
或long
变量,那么您将需要同步 - 递增涉及读/本地递增/写入,这远非原子操作。 (即使变量是 volatile
以避免内存模型过时问题,您仍然需要三个不同的操作,并且有可能在任何对之间被抢占。)
幸运的是,Java 提供了AtomicInteger
和AtomicLong
,它们可以在没有任何同步的情况下使用:
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/…以上是关于需要同步增量计数器?的主要内容,如果未能解决你的问题,请参考以下文章