Java 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和

在Linux的不同线程之间共享绑定到JNI库的对象时,我遇到了一个问题,我正在试图理解为什么会产生这个问题,以及是什么导致了这个问题

以下是场景:

  • 我有一个第三方(我们称之为LIB)库,它是用C语言为windows和Linux编写的(我没有访问源代码的权限,但是为了讨论这个库,我们假设它一切正常)

  • 我创建了一个JNI包装器,它公开了一组从Java调用的方法,这些方法随后从LIB调用函数

  • 有一个Java对象(我们称之为OBJ)加载JNI包装器并调用其函数

我在Java应用程序中有两个线程T1和T2,我在T1中实例化OBJ,并调用其中的一些函数(在后面调用调用调用LIB的JNI包装器)。我正在将OBJ传递给T2,现在在Windows上一切都可以正常工作——OBJ、JNI包装器和LIB保持其状态,而在LINUX中OBJ保持其状态,但似乎LIB没有

更清楚地说,假设LIB有两个函数:
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中存在错误