我正在尝试创建一个Stats计数器(类似于Twitter上针对scala的鸵鸟中的计数器),但是很难确保我所有的线程都可以访问此计数器。我的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,但是我正在尝试创建一个机架应用程序(Sinatra,使用jetty-rackup嵌入Jetty中),以显示此信息,并在该Sinatra应用程序中显示该信息。统计信息为空。有什么好方法可以与应用程序的其他部分共享此计数器,或者sinatra是否正在执行清除全局变量范围的操作?
最佳答案
我们在IRC#jruby上讨论了此问题,但为了在后一遍重申一下,我最好的猜测是,您遇到了这样一种情况,码头码头正在创建并汇集多个运行时用于服务请求。这些运行时中的每个运行时都加载了相同的Ruby代码,但彼此之间并不了解,这类似于多个Ruby进程。您有许多选项可以共享它们之间的状态。