0

我对多线程环境下的 JNI 实现感到困惑。我有一个如下的java类,代表本机接口:

public class Test {
    public native int doSum(int a, int b);
}

而对应的native方法是用c实现的。

现在,我的问题是,我有多个线程,比如说 5。它们都在使用上面类 Test 的一个全局实例。那么,用 C 编写的本机方法代码是否可能是线程安全的?或者我是否需要像问题中提到的那样使其线程安全?

如果我为每个线程创建单独的 Test 类实例,然后调用本机函数怎么办?这会表现出线程安全吗?

谢谢。

4

2 回答 2

1

将原生方法定义为 public native synchronized int doSum(int a, int b) 是否正确?

如果您希望它是一个接受两个整数参数并返回一个整数结果的同步方法,这是正确的。只有你知道。

那么,用 C 编写的本机方法代码是否可能是线程安全的?

如果以这种方式实施,这是可能的。没有看到代码就不可能说。

或者我是否需要像问题中提到的那样使其线程安全?

如果它的实现还不是线程安全的,并且您的使用模式要求它是线程安全的,则需要使其成为线程安全的。这不是一个真正的问题。

于 2013-03-01T09:12:10.177 回答
0

我对用 C 实现的 Java 方法一无所知,但是在 C 和 Java 中,如果没有显式同步,就无法保证线程安全。两个线程可以同时执行相同的方法。

“线程安全”意味着方法可以在所有情况下容忍这种情况。想象一下,线程 A 执行了一半的方法,然后暂停,而线程 B 执行了其中的一部分,然后又恢复了……这会导致非常难以诊断的错误,所以最好小心。

一般来说,如果该方法正在读取或修改对象状态的任何部分,那么它应该被同步或保持在单个线程的本地。

关于这个主题有很多很好的阅读。如果您有兴趣,我建议您阅读一本关于并发编程的介绍性书籍。:)

于 2013-03-01T08:02:58.157 回答