【问题标题】:Java ScriptEngine with multiple Threads and Lock具有多线程和锁的 Java ScriptEngine
【发布时间】:2014-01-09 23:39:54
【问题描述】:

我正在使用 JSR223 ScriptEngine (JAV8),它本身不是线程安全的。由于我需要多个线程才能访问 ScriptEngine,因此每个 ScriptEngine 都属于一个 EngineContext 对象。 这些 EngineContexts 再次具有一个 ReentrantLock,各个线程在访问 ScriptEngine 之前获取它。

我遇到的问题是线程成功获取了锁,但是当两个线程调用它时,有时我仍然会遇到 JVM 崩溃(著名的 SIGSEGV (0xb))。

作为概述,这里是一些锁定过程的伪代码

Thread needs the ScriptEngine
Thread waits and acquires lock
Thread uses the ScriptEngine (Methods: eval, put)
Thread releases the lock
Thread does something else

我真的不确定,这里的问题是什么。

【问题讨论】:

    标签: java multithreading v8 scriptengine jsr223


    【解决方案1】:

    SIGSEGV 总是由本机代码中的错误引起的。假设您自己没有编写任何本机代码,那么您要么滥用了库,要么触发了库中的错误,要么触发了 JVM 中的错误(按可能性降序排列......)。

    如果没有您提供更多详细信息(代码片段、崩溃日志),很难说出您的具体问题是什么。

    【讨论】:

      【解决方案2】:

      ReentrantLock 应该和使用 synchronized 一样工作,包括记忆效应,但在这种情况下它可能不会(可能与本机代码有关)并且 ScriptEngine 的状态在线程之间没有完全同步.您是否尝试过使用同步而不是 ReentrantLock?

      如果这没有帮助,您是否尝试过为每个线程设置一个单独的 ScriptEngine,例如使用 ThreadLocal?取决于什么类型的线程,这些引入的开销可能不会太糟糕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-20
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多