我使用的是JSR223 ScriptEngine (JAV8),它本身不是线程安全的。因为我需要多个线程才能访问ScriptEngine,所以每个ScriptEngine都属于一个EngineContext对象。这些EngineContexts同样有一个ReentrantLock,由各个线程在访问ScriptEngine之前获取。
我遇到的问题是,线程成功地获取了锁,但当两个线程调用JVM时,我仍然会遇到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我真的不确定,这里的问题是什么。
发布于 2014-04-08 21:31:17
SIGSEGV总是由本机代码中的错误引起的。假设您自己没有编写任何本机代码,那么您要么误用了库,要么触发了库中的bug,要么触发了JVM中的bug (按照可能性的降序...)。
如果没有您提供的更多细节(代码片段、崩溃日志),就很难判断您的具体问题是什么。
发布于 2014-06-11 21:17:39
ReentrantLock应该与使用synchronized的工作方式相同,包括内存效果,但在这种情况下可能不是这样(可能与本机代码有关),并且ScriptEngine的状态在线程之间不是完全同步的。您是否尝试过使用synchronized而不是ReentrantLock?
如果这还不能解决问题,那么您是否尝试过为每个线程设置一个单独的ScriptEngine,例如使用ThreadLocal?根据线程类型的不同,引入的开销可能不会太大。
https://stackoverflow.com/questions/21033511
复制相似问题