2011-10-04 59 views
24

我使用一个整数作为计数器。整数只会增加,当然不止一个线程会同时增加它。当其他线程不会尝试访问它的值时,在程序执行结束时读取此计数器的值。需要同步增量专用计数器吗?

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

回答

59

如果你只是使用intlong变量,那么你会需要同步 - 递增包括读/递增,本地/写,这是远离一个原子操作。 (即使变量是volatile避免过时的内存模型的关注,你仍然有三个不同的操作,与被抢占前任何对它们之间的可能性。)

好在Java提供AtomicIntegerAtomicLong可以没有任何同步被使用:

private final AtomicLong counter = new AtomicLong(); 

... 

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

像往常一样,通过乔恩斯基特一个真棒答案。乔恩你还写了任何有关Java编程的书籍,如果有的话,请让我知道:) 其他书籍的推荐也将赞赏 – JavaSa

+5

@JavaSa:不,我没有在Java上写过任何东西。尽管如此,我会彻底推荐Josh Bloch的Effective Java。 –

+0

谢谢,您是否还有免费的书籍建议,以涵盖自2005年以来Java中新增的新功能?可以说对于Java 7,也许是Java 8 – JavaSa