在linux中的线程之间共享JNI对象

时间:2016-07-21 07:52:30

标签: java linux multithreading concurrency java-native-interface

我遇到了在Linux中不同线程之间共享绑定到JNI库的对象的问题,我试图理解为什么会导致它以及导致它的原因?

以下是该方案:

  • 我有一个第三方(让我们称之为LIB)用C语言编写的用于Windows和Linux的库(我无法访问源代码,但我们假设为了这个目的,该库的一切正常讨论)

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

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

我在Java Application中有2个线程T1和T2,我在T1中实例化OBJ,调用它上面的一些函数(在后面调用调用LIB的JNI包装器)。我正在将OBJ传递给T2,现在在Windows上一切正常工作 - OBJ,JNI包装器和LIB保持其状态,但在LINUX中OBJ保持其状态,但似乎LIB没有。

为了更清楚,让我们说LIB有两个功能:setValue(a)getValue(a),如果我在T1中调用setValue(1)然后在T2调用getValue(),则在Windows中(当然通过OBJ和JNI)我将得到值1,在LINUX中我得到垃圾,好像状态/ 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();

LIB的LINUX版本中可能存在一个错误,但假设没有,我在这里缺少一些关于JNI,Java,进程/线程在Linux和Windows中工作的方法,可以解释这种行为?

0 个答案:

没有答案