3

我正在使用 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

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

4

2 回答 2

0

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

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

于 2014-04-08T13:31:17.427 回答
0

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

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

于 2014-06-11T13:17:38.587 回答