在线程之间共享JNI绑定库,奇怪的行为

时间:2016-09-08 19:52:13

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

所以我有这个场景:

有一个Java类让我们称它为OBJ,通过JNI通过C包装器(WRAP)调用C库(LIB)上的一些方法。 我只能访问OBJ和WRAP源代码,我不知道LIB中有什么,我只知道它暴露了一些由te包装器(WRAP)调用的方法,它通过OBJ中的JNI调用。

在线程之间共享OBJ时,我遇到了非常奇怪的行为,这是一个例子:

OBJ obj = null;

Thread t1 = new Thread(new Runnable() {

    @Override
    public void run() {
        obj = new OBJ();
    }

});

t1.start();
t1.join();

System.out.println("Value from main thread: " + obj.getValue());


Thread t2 = new Thread(new Runnable() {

    @Override
    public void run() {
        System.out.println("Value from t2 thread: " + obj.getValue());

    }

});

t2.start();
t2.join();

运行上面的代码时,第一个System.out.println()返回不正确的值,而第二个System.out.println()打印正确的值。 obj.getValue()在包装器上调用本机方法(getValueC),包装器从库(LIB)调用方法。 如上所述,我无法访问LIB,但我首先要确保我的思路没有任何问题,线程t1,t2和主线程之间有什么区别吗? 令人惊讶的是,如果我在主线程中实例化对象,那么t1和t2都将打印正确的值。 是否可能需要在主线程中实例化JNI绑定对象?

0 个答案:

没有答案