Clojure中的同步计数器
如果我想保留一个全局计数器(例如,计算多个线程中传入请求的数量),那么在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我会使用 Clojure 中的 atom 来完成此操作:
这是完全线程安全的,并且性能令人惊讶。此外,由于它使用 Clojure 的任意精度数字处理,因此它不会像易失性 int 那样容易受到整数溢出的影响......
I would do this with an atom in Clojure:
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.....
将全局计数器定义为
代理
要增加代理中包含的值,您
发送
< /a> 一个函数(在本例中inc
) 到代理:读取当前值,您可以使用
deref
或@
阅读器宏:代理只是几种可用的参考类型之一。您可以在 Clojure 网站上阅读有关这些内容的更多信息:
Define a global counter as an
agent
To increase the value contained in the agent you
send
a function (in this caseinc
) to the agent:To read the current value you can use
deref
or the@
reader macro:Agents are only one of several available reference types. You can read more about these things on the Clojure website: