相关疑难解决方法(0)

Java多线程和安全发布

在阅读" 实践中的Java并发 "和" 实践中的OSGI "后,我发现了一个非常有趣的特定主题; 安全出版.以下内容来自JCIP:

要安全地发布对象,必须同时使对象的引用和对象的状态对其他线程可见.正确构造的对象可以通过以下方式安全发布:

  • 静态初始化程序初始化对象引用.
  • 将对它的引用存储到volatile字段中.
  • 将对它的引用存储到最终字段中.
  • 将对它的引用存储到由(同步)锁定正确保护的字段中.

我的第一个问题:有多少java开发人员知道这个(问题)?有多少真实世界的Java应用程序真正遵循这个,这真的是一个真正的问题吗?我有一种感觉,99%的已实现的JVM不是那种"邪恶",即一个线程不能保证(事实上它实际上(几乎)"不可能")看到陈旧数据只是因为引用不遵循上面的"安全出版成语".

java multithreading safe-publication

39
推荐指数
2
解决办法
8759
查看次数

在Servlet中重用Nashorn ScriptEngine

我想在servlet中执行JavaScript.是否可以在所有servlet调用中重用相同的Scripting Engine?Servlet实例由多个线程共享.这是否需要为每个请求创建一个新的Scripting Engine?这将是一个令人无法接受的性能损失.例如,以下代码是否保存?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

}

如果这不安全,那么避免每个请求创建引擎的最佳方法是什么?使用引擎池? …

java servlets nashorn

13
推荐指数
1
解决办法
4036
查看次数