栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否应该在每个线程中使用单独的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语言语义)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号