![](/img/trans.png)
[英]Why make short and long-lived objects a difference in garbage collection?
[英]JRuby long-lived objects
是否可以在JRuby上运行的Rails应用程序中创建一个Java对象,使其在HTTP调用之间保持“活动”状态?
让我们以一个例子为例,我有一个Counter类(忽略不流行的单例,仅是为了简洁):
public class Counter {
static Counter instance = new Counter();
static Counter getInstance() {return instance;}
private int counter;
public Counter() {
counter = 0;
}
public void inc() {
counter = counter + 1;
}
public int getCounter() {
return counter;
}
};
我可以以某种方式调用Counter.getInstance()。inc()并期望计数器在两次HTTP调用之间增加吗?
是的,您应该尝试一下,如果您是在类路径上(例如,在.jar或只是添加到$ CLASSPATH的目录中),则应该:
Java::counter_package::Counter.getInstance.inc
但是我认为您真正的困惑是JRuby上的Rails应用通常如何工作-因为Java(底层平台)具有真实的线程,并且没有GIL ...您将运行一个进程,并且您所有的Ruby类等等都是“生存”-它们不会在请求之间“重新加载”,因此您可以在Ruby中做一个计数器:
module Counter
include Singleton
@@count = 0
def self.inc; @@count += 1 end
def self.value; @@count end
end
并将其用作: Counter.instance.inc
,该值将在Counter.instance.inc
请求之间保留,直到您重新启动(或进行“热”重新部署)为止
ps虽然要记住的一件事是线程安全性……JRuby有一个技巧使@@var +=
以某种方式“原子”(这绝不是原子操作),我建议将原子gem用于真正的原子计数器或围绕此类操作进行synchronize {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.