2011-09-18 16 views
9

如果我想保留一个全局计数器(例如计算跨多个线程的传入请求数),那么在java中最好的方法是使用volatile int。假设,正在使用clojure是否有更好的(更好的吞吐量)方法?clojure中的同步计数器

回答

13

我会做这个用Clojure中的atom

(def counter (atom 0N)) 

;; increment the counter 
(swap! counter inc) 

;; read the counter 
@counter 
=> 1 

这完全是线程安全的,令人惊奇的高性能。此外,由于它使用Clojure的abitrary精度的数字处理,这是不容易的方式,挥发性INT可以整数溢出.....

+0

将它提供更好的吞吐量然后使用挥发性诠释?如果是的话,任何关于为什么/如何更好的见解。 – 142857

+1

一个原子比volatile变得慢一点。但是除非你每秒钟计数数百万次事件,否则差别不会太大。在吞吐量的水平上,一个易失性int会在不到一个小时内溢出...... – mikera

+3

在Clojure 1.3上,它可能溢出:'(swap!(atom 9223372036854775807)inc)'抛出一个溢出异常。解决方法是使用BigInts:'(swap!(atom 9223372036854775807N)inc)'或自动提升'inc''功能 –