Dil*_*nga 30 java concurrency lifecycle rhino
我对(Rhino)脚本引擎和相关类的生命周期和并发语义感兴趣.特别:
Bindings应该是线程安全的?ScriptEngine.eval(...)?CompiledScript实例Invocable.getInterface(...)?Bob*_*har 23
所以我运行实验并且Rhino引擎报告"Mozilla Rhino"是多线程的,JavaDocs断言
"MULTITHREADED" - 引擎实现在内部是线程安全的,并且脚本可以并发执行,尽管脚本执行对一个线程的影响可能对其他线程上的脚本可见."
这是代码......它看起来对我来说是线程安全的,只要你传入的绑定也是线程安全的.
package org.rekdev;
import java.util.*;
import javax.script.*;
public class JavaScriptWTF {
public static void main( String[] args ) {
ScriptEngineManager mgr = new ScriptEngineManager();
List<ScriptEngineFactory> factories = mgr.getEngineFactories();
for ( ScriptEngineFactory factory : factories ) {
System.out.println( String.format(
"engineName: %s, THREADING: %s",
factory.getEngineName(),
factory.getParameter( "THREADING" ) ) );
}
}
}
Run Code Online (Sandbox Code Playgroud)
...输出是......
engineName:AppleScriptEngine,
THREADING :null engineName:Mozilla Rhino,THREADING:MULTHTHREADED
回答你的确切问题......
绑定应该是线程安全的吗?
在我看来,你有责任让它们成为线程安全的.换句话说,只传递不可变对象以及引擎是否是线程安全的都不成问题.
是否应该允许多个线程共享一个ScriptEngine实例?
这听起来像他们可以,但关键是通过Bindings可以发生的状态共享.不可变对象是你的朋友.
...或者每个线程是否应构建一个短期实例?
在我看来,想到这一点的最好方法是每次执行eval都是一个短暂的实例.
......还是把它们放在游泳池里?
在这个时代,尝试自己集中资源并不是一个好主意.给这个短命的实例一个镜头,测量它的性能,然后从那里开始工作.
如果多个线程同时调用ScriptEngine.eval(...)会发生什么?
如果我正确理解了Rhino引擎对MULTITHREADING的反应,那么对于并发调用,ScriptEngine.eval应该没问题.
CompiledScript实例
的相同问题JavaDocs声明"在随后的引擎执行脚本期间,可能会看到由执行CompiledScript引起的ScriptEngine状态的变化." http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html.因此,在您似乎试图最小化ScriptEngine实例数量的环境中,它们根本不会发出线程安全的声音.
使用Invocable.getInterface(...)生成的接口实现的问题相同?你在这里独自一人.我不明白为什么或什么时候使用这种能力,听起来像你可能在这里"跳鲨鱼".如果你想深入研究脚本语言,我建议你放弃JavaScript并查看Groovy以获得更易编写脚本的Java.
据推测,放置在Bindings中的对象遵循Java的垃圾收集.那些没有在绑定中结束的对象的垃圾收集呢?
如果它们最终没有绑定,我希望它们绑定到ScriptEngine并遵循它的生命周期(基于我读过的文档).汇集ScriptEngine实例并不是一个好主意.
| 归档时间: |
|
| 查看次数: |
4034 次 |
| 最近记录: |