2011-09-18 47 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''功能 –