2011-08-04 2 views
30

(Rhino) Script Engine 및 관련 클래스의 수명주기 및 동시성 의미에 관심이 있습니다. 구체적으로 :Rhino Script Engine의 라이프 사이클 및 동시성 의미 란 무엇입니까

  1. Bindings은 스레드로부터 안전합니까?
  2. 하나의 ScriptEngine 인스턴스를 여러 스레드에서 공유 할 수 있습니까?
  3. ... 또는 각 스레드가 수명이 짧은 인스턴스를 생성해야합니까?
  4. ... 또는 수영장에 보관 하시겠습니까?
  5. 여러 스레드가 동시에 ScriptEngine.eval(...)을 호출하면 어떻게됩니까?
  6. 동일한 질문이 CompiledScript
  7. Invocable.getInterface(...)을 사용하여 생성 된 인터페이스 구현에 대해 동일한 질문이 있습니까?
  8. 아마도 Bindings에있는 객체는 Java의 가비지 수집을 따릅니다. 바인딩에서 끝나지 않는 객체의 가비지 수집은 어떻습니까?
+2

JavaDocs에서는 구현에 스레드 안전성 보증을 요청할 것을 권장합니다. http : //download.oracle.com/javase/6/docs/api/javax/script/ ScriptEngineFactory.html # getParameter (java.lang.String) getParameter 메소드를 살펴보고 THREADING으로 재생합니다. –

답변

23

그래서 내가 실험과 코뿔소 엔진 보고서를 실행했습니다 "모질라 코뿔소"는 JavaDoc을가

"멀티 스레드"주장 다중 스레드 - 엔진 구현은 내부적으로 스레드 안전 이며 스크립트는 할 수있다 스크립트의 효과가 하나 개의 스레드에 실행이 다른 스레드에 스크립트를 볼 수 있지만 동시에 실행합니다. "여기

코드의 ...이 한 바인딩 당신이 아칸소 전달, 나에게 스레드를 찾습니다 전자 threadsafe 너무.
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"))); 
     } 
    } 
} 

... 출력은 ...

engineName : AppleScriptEngine, 스레딩 : 널 (null)
engineName : 모질라 코뿔소, 스레딩 : 멀티 스레드

가 정확한 답변을 질문 ...

  1. 바인딩은 스레드로부터 안전합니까?
    스레드로부터 안전하게 만드는 것은 사용자의 책임이라는 생각이 듭니다. 즉, 변경 불가능한 객체 만 전달하고 엔진이 스레드 안전성인지 여부가 문제가되지 않습니다.

  2. 하나의 ScriptEngine 인스턴스를 여러 스레드에서 공유 할 수 있습니까?
    그들이 할 수있는 것처럼 들리지만, 열쇠는 바인딩을 통해 발생할 수있는 상태 공유입니다. 변경할 수없는 개체는 친구입니다.

  3. ... 또는 각 스레드가 수명이 짧은 인스턴스를 구성해야합니까?
    이 점을 생각하는 가장 좋은 방법은 각각의 eval 실행이 짧은 수명의 인스턴스라는 것입니다.

  4. ... 또는 수영장에 보관 하시겠습니까?
    리소스를 스스로 풀링하려고 시도하는이 날과 나이에 거의 좋은 아이디어가 아닙니다. 수명이 짧은 인스턴스에게 샷을주고 성능을 측정하고 거기에서부터 운동하십시오.

  5. 여러 스레드가 동시에 ScriptEngine.eval (...)을 호출하면 어떻게됩니까?
    MULTITHREADING에 대한 Rhino 엔진의 repsonse를 올바르게 이해했다면 ScriptEngine.eval은 동시 호출에서 문제가 없어야합니다.

  6. CompiledScript를 인스턴스

    같은 질문 JavaDoc에서이 상태
    그 "를 CompiledScript를 실행에 의한 ScriptEngine의 상태 변화 할 수있다 엔진에 의해 스크립트의 후속 실행시 볼." http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html. 따라서 ScriptEngine 인스턴스의 수를 최소화하려고 시도하는 환경에서는 스레드 안전성이 전혀 들리지 않습니다.

  7. Invocable.getInterface (...)를 사용하여 생성 된 인터페이스 구현에 대해 동일한 질문이 있습니까? 여기에 귀하가 있습니다. 왜 또는 언제이 기능을 사용할 지 이해할 수 없으며 당신이 "상어를 뛰어 넘을 것"처럼 들릴 것입니다. 이 부분을 스크립팅 언어로 옮기고 싶다면 자바 스크립트를 포기하고 Groovy에서 스크립트가 가능한 Java를 찾아 보는 것이 좋습니다.

  8. 아마도 Bindings에있는 객체는 Java의 가비지 수집을 따릅니다. 바인딩에서 끝나지 않는 객체의 가비지 수집은 어떻습니까?
    바인딩에서 끝나지 않으면 ScriptEngine에 바인딩되고 수명주기를 따라야합니다 (읽은 문서를 기반으로 함). ScriptEngine 인스턴스를 풀링하는 것은 좋은 생각이 아닙니다.

+0

풀링과 인스턴스화에 대한보다 명확한 답변을 원하지만 대부분의 내용을 다루었습니다. 귀하의 연구에 감사드립니다. –