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

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

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

【问题讨论】:

    标签: java synchronization counter increment


    【解决方案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 书籍了......
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 2021-08-14
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多