【发布时间】:2011-09-18 12:47:44
【问题描述】:
如果我想保留一个全局计数器(例如,计算跨多个线程的传入请求数),那么在 java 中最好的方法是使用 volatile int。假设正在使用 clojure,有没有更好(更好的吞吐量)的方法?
【问题讨论】:
标签: multithreading clojure volatile
如果我想保留一个全局计数器(例如,计算跨多个线程的传入请求数),那么在 java 中最好的方法是使用 volatile int。假设正在使用 clojure,有没有更好(更好的吞吐量)的方法?
【问题讨论】:
标签: multithreading clojure volatile
我会在 Clojure 中使用 atom 来做到这一点:
(def counter (atom 0N))
;; increment the counter
(swap! counter inc)
;; read the counter
@counter
=> 1
这是完全线程安全的,而且性能惊人。此外,由于它使用 Clojure 的任意精度数字处理,它不会像 volatile int 那样容易受到整数溢出的影响.....
【讨论】:
(swap! (atom 9223372036854775807) inc) 抛出溢出异常。解决方法是使用 BigInts:(swap! (atom 9223372036854775807N) inc) 或自动提升 inc' 函数