Java linux中线程间共享JNI对象
在Linux的不同线程之间共享绑定到JNI库的对象时,我遇到了一个问题,我正在试图理解为什么会产生这个问题,以及是什么导致了这个问题 以下是场景:Java linux中线程间共享JNI对象,java,linux,multithreading,concurrency,java-native-interface,Java,Linux,Multithreading,Concurrency,Java Native Interface,在Linux的不同线程之间共享绑定到JNI库的对象时,我遇到了一个问题,我正在试图理解为什么会产生这个问题,以及是什么导致了这个问题 以下是场景: 我有一个第三方(我们称之为LIB)库,它是用C语言为windows和Linux编写的(我没有访问源代码的权限,但是为了讨论这个库,我们假设它一切正常) 我创建了一个JNI包装器,它公开了一组从Java调用的方法,这些方法随后从LIB调用函数 有一个Java对象(我们称之为OBJ)加载JNI包装器并调用其函数 我在Java应用程序中有两个线程T1和
- 我有一个第三方(我们称之为LIB)库,它是用C语言为windows和Linux编写的(我没有访问源代码的权限,但是为了讨论这个库,我们假设它一切正常)
- 我创建了一个JNI包装器,它公开了一组从Java调用的方法,这些方法随后从LIB调用函数
- 有一个Java对象(我们称之为OBJ)加载JNI包装器并调用其函数
setValue(a)
和getValue(a)
,在windows中,如果我在T1中调用setValue(1)
,然后在T2中调用getValue()
(当然是通过OBJ和JNI),我会得到值1,在LINUX中,我会得到垃圾,就好像state/LIB实例丢失一样
线程是同步的,即有一种机制确保T2在T1初始化OBJ之前和T1调用OBJ期间不会调用OBJ,例如:
OBJ driver = new OBJ();
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
synchronized(driver) {
driver.setValue(99);
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
synchronized(driver) {
System.out.println("Value : " + driver.getValue());
}
}
});
t1.start();
t1.join();
t2.start();
t2.join();
在LINUX版本的LIB中可能有一个bug,但假设没有,关于JNI、Java、进程/线程在LINUX和Windows中的工作方式,这里是否缺少一些可以解释这种行为的东西?是否有一种机制可以确保T1在T2调用OBJ时不会调用OBJ?你是否正确使用了Java同步?是的,我刚刚编辑了我的帖子来添加这一行。线程是同步的。你还没有回答我的问题。您需要发布一些代码。如果不了解库的实现,就不可能知道Linux下是否存在特定于线程的库状态。在返回Java之前,将调试代码放入包装器中,查看您的值是否混乱。这表明LIB中存在错误