Rhino和并发访问javax.script.ScriptEngine

Mik*_*zak 17 javascript java rhino

我正在通过javax.scriptAPI 使用Rhino 1.6r2 .我知道Rhino引擎声称是MULTITHREADED: "引擎实现是内部线程安全的,并且脚本可以并发执行,尽管脚本执行对一个线程的影响可能对其他线程上的脚本可见."

我想知道的是,在什么条件下,一个脚本执行的效果对另一个可见?在我的代码中,我有时会重用一个ScriptEngine对象,但是对于每次执行,我都会创建一个new SimpleBindings并将其传递给它eval(String, Bindings).有了这种安排,内部状态是否有任何方式可以从一个执行泄漏到另一个执行?如果是这样,怎么样?

有一个非常丰富的答案在这里,但它并不十分告诉我什么,我需要知道的.

Chi*_*kei 3

是的,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)