Reuse Nashorn ScriptEngine no Servlet [duplicado]

Esta pergunta já tem uma resposta aqui:

Devo usar instâncias ScriptEngine e CompiledScript separadas por cada thread? 4 respostas

Eu quero executar um JavaScript dentro de um servlet. É possível reutilizar o mesmo mecanismo de script em todas as chamadas de servlet? Instâncias de servlet são compartilhadas por vários encadeamentos. Isso requer a criação de um novo mecanismo de script por solicitação? Isso seria uma penalidade de desempenho inaceitável. Como exemplo, o seguinte código é salvo?

public class MyServlet extends HttpServlet {

private ScriptEngineManager factory;
private ScriptEngine engine;

@Override
public void init() throws ServletException {
    factory = new ScriptEngineManager();
    engine = factory.getEngineByName("nashorn");
}

@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
    try (PrintWriter writer = res.getWriter()) {
        ScriptContext newContext = new SimpleScriptContext();
        newContext.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
        Bindings engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);
        engineScope.put("writer", writer);
        Object value = engine.eval("writer.print('Hello, World!');", engineScope);
        writer.close();
    } catch (IOException | ScriptException ex) {
        Logger.getLogger(AsyncServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

Se isso não for seguro, qual seria a melhor maneira de evitar a criação de um mecanismo por solicitação? Usando um pool de motores?

Editar É possível reutilizar um e o mesmo mecanismo e o mesmo JavaScriptObject, que resulta da avaliação de uma função JS, para todas as solicitações de servlet, se a função não alterar nenhum objeto compartilhado, mas usar apenas os argumentos fornecidos com a chamada? Veja a seguinte adaptação do exemplo acima:

public class MyServlet extends HttpServlet {

private ScriptEngineManager factory;
private ScriptEngine engine;
private ScriptObjectMirror script;

@Override
public void init() throws ServletException {
    try {
        factory = new ScriptEngineManager();
        engine = factory.getEngineByName("nashorn");
        script = (ScriptObjectMirror)engine.eval("function(writer) {writer.print('Hello, World!');}");
    } catch (ScriptException ex) {
        Logger.getLogger(MyServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
    try (PrintWriter writer = res.getWriter()) {
        script.call(null, writer);
        writer.close();
    } catch (IOException ex) {
        Logger.getLogger(MyServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Isso é seguro?

questionAnswers(1)

yourAnswerToTheQuestion