【发布时间】:2010-08-10 00:02:24
【问题描述】:
我正在尝试创建一个统计计数器(类似于 Twitter 为 scala 编写的 ostrich 计数器),但很难确保我的所有线程都可以访问它。我的 Stats 类是这样定义的:
class Stats
@@counters = {}
.. accessors ..
def self.incr(counter, amt = 1)
if !@@counters[counter]
@@counters[counter] = java.util.concurrent.atomic.AtomicInteger.new()
end
@@counters[counter].getAndAdd(amt)
end
end
我知道计数器哈希本身的线程安全存在一些问题。如果我手动创建线程,它们似乎能够全局访问 Stats.counters 但我正在尝试创建一个 rackup 应用程序(Sinatra,使用 jetty-rackup 嵌入 Jetty)来显示此信息,并在该 Sinatra 应用程序中统计为空。是否有一种与应用程序的其他部分共享此计数器的好方法,或者 sinatra 是否正在做一些清除全局变量范围的事情?
【问题讨论】:
-
是否可以选择使用 MongoDB 之类的东西?
-
是的,我考虑过使用外部的东西,比如 Mongo 或 Redis,但我认为将它们全部保存在 JVM 中会更容易。
标签: ruby multithreading jruby