【发布时间】:2011-11-30 13:39:40
【问题描述】:
我使用整数作为计数器。整数只会增加,而且肯定不止一个线程会同时增加它。该计数器的值在程序执行结束时读取,此时没有其他线程将尝试访问其值。
我假设我不必为这种仅增量计数器使用锁或任何类型的同步。这是正确的吗? 如果这有什么不同,我会用 Java 编写代码。
【问题讨论】:
标签: java synchronization counter increment
我使用整数作为计数器。整数只会增加,而且肯定不止一个线程会同时增加它。该计数器的值在程序执行结束时读取,此时没有其他线程将尝试访问其值。
我假设我不必为这种仅增量计数器使用锁或任何类型的同步。这是正确的吗? 如果这有什么不同,我会用 Java 编写代码。
【问题讨论】:
标签: java synchronization counter increment
如果您只使用了int 或long 变量,那么您将需要同步 - 递增涉及读/本地递增/写入,这远非原子操作。 (即使变量是 volatile 以避免内存模型过时问题,您仍然需要三个不同的操作,并且有可能在任何对之间被抢占。)
幸运的是,Java 提供了AtomicInteger 和AtomicLong,它们可以在没有任何同步的情况下使用:
private final AtomicLong counter = new AtomicLong();
...
counter.incrementAndGet(); // No need for synchronization
【讨论】: