关于多线程访问本地DLL的问题

songyangaaron 2008-04-30 11:34:19
基本情况:

通过JNI调用本地DLL实现一个功能,程序结构:工作类->包装类(Caller)->JNI接口->DLL文件。

JNI接口类里的方法都是同步方法,加了synchronized。包装类里通过单例模式保证只有一个JNI接口类实例。

Java程序和DLL功能之间传递的参数为byte[]。

问题:

工作类用单线程访问包装类里的功能方法时,没有任何问题,调用多少次都没有问题。

工作类中用多线程访问(即使是同步访问)时,第一个线程第一次调用成功,其他线程一调用JVM就抛出异常(具体信息附后)。

请问:

1.为什么即使通过同步来保证多线程访问DLL功能是顺序串行发生的,仍然和单线程访问不同?

2.用什么办法解决这个问题可以保证程序的性能?

3.单独运行一个进程提供DLL中的功能,用进程间通讯的方式是不是可以解决?

谢谢!


异常信息:
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x030094c1, pid=11008, tid=13224
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0_03-b05 mixed mode, sharing)
# Problematic frame:
# C [HLSSplit.dll+0x294c1]
#
# An error report file with more information is saved as hs_err_pid11008.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
...全文
295 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
w5325698 2008-04-30
  • 打赏
  • 举报
回复
你用多线程里的资源锁定不就搞定拉吗?
songyangaaron 2008-04-30
  • 打赏
  • 举报
回复
目前暂时用第3种办法解决了问题,估计要从根本上解决还是比较麻烦的
zealVampire 2008-04-30
  • 打赏
  • 举报
回复
可能见过类似的问题,

保证JNI 版本的DLL加载在当前线程只是加载一次; 加载两次不知会不会死人, JVM也死了 :0
static {
System.load("youJNI.dll");
}


保证在C代码里面,对称
LoadLibery("nativeWin32Dll");
FreeLibery();

JNA好像用起来是方便不少啊。
guoxiaopeng1982 2008-04-30
  • 打赏
  • 举报
回复
对JNI不熟悉,我一般都是用的JNA,据我所知,DLL动态库本来就支持多个进程访问它~~~~
liuyaaixx 2008-04-30
  • 打赏
  • 举报
回复
你的这是一个跟访问的资源有关系,你可以对资源的访问以池的方式访问
songyangaaron 2008-04-30
  • 打赏
  • 举报
回复
用synchronized锁定了啊,不行啊

[Quote=引用 1 楼 w5325698 的回复:]
你用多线程里的资源锁定不就搞定拉吗?
[/Quote]

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧