Clojure中的同步计数器

发布于 2024-12-05 02:45:05 字数 104 浏览 0 评论 0原文

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

If I want to keep a global counter (e.g. to count number of incoming requests across multiple threads), then the best way to do in java would be to use a volatile int. Assuming, clojure is being used is there a better (better throughput) way to do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最初的梦 2024-12-12 02:45:05

我会使用 Clojure 中的 atom 来完成此操作:

(def counter (atom 0N))

;; increment the counter
(swap! counter inc)

;; read the counter
@counter
=> 1

这是完全线程安全的,并且性能令人惊讶。此外,由于它使用 Clojure 的任意精度数字处理,因此它不会像易失性 int 那样容易受到整数溢出的影响......

I would do this with an atom in Clojure:

(def counter (atom 0N))

;; increment the counter
(swap! counter inc)

;; read the counter
@counter
=> 1

This is totally thread-safe, and surprisingly high performance. Also, since it uses Clojure's abitrary-precision numeric handling, it isn't vulnerable to integer overflows in the way that a volatile int can be.....

江湖彼岸 2024-12-12 02:45:05

将全局计数器定义为 代理

(def counter (agent 0))

要增加代理中包含的值,您发送< /a> 一个函数(在本例中 inc) 到代理:

(send counter inc)

读取当前值,您可以使用 deref@ 阅读器宏:

@counter ;; same as (deref counter)

代理只是几种可用的参考类型之一。您可以在 Clojure 网站上阅读有关这些内容的更多信息:

Define a global counter as an agent

(def counter (agent 0))

To increase the value contained in the agent you send a function (in this case inc) to the agent:

(send counter inc)

To read the current value you can use deref or the @ reader macro:

@counter ;; same as (deref counter)

Agents are only one of several available reference types. You can read more about these things on the Clojure website:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文