是否应该在每个线程中使用单独的ScriptEngine和CompiledScript实例?

是否应该在每个线程中使用单独的ScriptEngine和CompiledScript实例?,第1张

是否应该在每个线程中使用单独的ScriptEngine和CompiledScript实例?

您可以跨线程共享

scriptEngine
Compiledscript
对象。它们是线程安全的。实际上,您应该共享它们,因为单个引擎实例是类缓存和Javascript对象的隐藏类的持有者,因此,只有一个实例可以减少重复编译。

您无法共享的是

Bindings
对象。绑定对象基本上对应于Javascript运行时环境的
Global
对象。该引擎以默认的绑定实例开始,但是如果在多线程环境中使用它,则需要使用它
engine.createBindings()
为每个线程(它自己的全局变量)获取一个单独的Bindings对象,并评估其中的编译脚本。这样,您将使用相同的代码设置隔离的全局范围。(当然,您也可以合并它们,或在’em上进行同步,只需确保在一个绑定实例中工作的线程不超过一个)。将脚本评估为绑定之后,您可以随后有效地调用其定义的函数
((JSObject)bindings.get(fnName).call(this,args...)

如果必须在线程之间共享状态,则至少尝试使其不可变。如果您的对象是不可变的,则最好将脚本评估为单个

Bindings
实例,然后跨线程使用它(希望调用无副作用的函数)。如果是可变的,则必须进行同步;既可以是整个绑定,也可以使用
varsyncFn = Java.synchronized(fn, lockObj)
Nashorn特定的JS API来获取在特定对象上同步的JS函数的版本。

前提是您在线程之间共享单个绑定。如果要让多个绑定共享对象的子集(例如,通过将同一个对象放入多个绑定中),则必须以某种方式处理确保对共享对象的访问本身是线程安全的。

至于

THREADING
返回null的参数:是的,最初我们计划不使引擎具有线程安全性(假设语言本身不是线程安全的),所以我们选择了null值。我们现在可能需要重新评估,因为与此同时我们做到了,以便引擎实例是线程安全的,只是全局范围(绑定)不是(并且永远不会,因为Javascript语言语义)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5564865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存