我正在尝试创建一个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进程。您有许多选项可以共享它们之间的状态。

  • 使用Java类(具有单例实例或静态方法/字段)
  • 使用专用的Java内存缓存库
  • 使用Java Servlet session
  • 使用外部机制(memcached,DB等)
  • 还有更多
  • 10-08 19:40