Mik*_*zak 17 javascript java rhino
我正在通过javax.script
API 使用Rhino 1.6r2 .我知道Rhino引擎声称是MULTITHREADED: "引擎实现是内部线程安全的,并且脚本可以并发执行,尽管脚本执行对一个线程的影响可能对其他线程上的脚本可见."
我想知道的是,在什么条件下,一个脚本执行的效果对另一个可见?在我的代码中,我有时会重用一个ScriptEngine
对象,但是对于每次执行,我都会创建一个new SimpleBindings
并将其传递给它eval(String, Bindings)
.有了这种安排,内部状态是否有任何方式可以从一个执行泄漏到另一个执行?如果是这样,怎么样?
有一个非常丰富的答案在这里,但它并不十分告诉我什么,我需要知道的.
是的,JSR223 没有指定脚本语言中的变量应如何与给定的Bindings
. 因此,实现者完全有可能选择在引擎实例中存储全局范围变量,并重用它,即使Bindings
在评估脚本时给出不同的情况。
例如,JRuby 的 JSR223 绑定有一种以这种方式工作的模式
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
public class Jsr223Binding {
private Jsr223Binding() throws ScriptException {
System.setProperty("org.jruby.embed.localvariable.behavior", "transient");
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("jruby");
ScriptContext ctx1 = new SimpleScriptContext();
ScriptContext ctx2 = new SimpleScriptContext();
engine.eval("$foo = 5\nputs $foo", ctx1);
engine.eval("puts $foo", ctx2);
}
public static void main(String[] args) throws ScriptException {
new Jsr223Binding();
}
}
Run Code Online (Sandbox Code Playgroud)