我对多线程环境下的JNI实现感到困惑。我有一个java类,如下所示,表示本机接口:
public class Test {
public native int doSum(int a, int b);
}
相应的本机方法在c。
中实现现在,我的问题是,我有多个线程,比如说5.它们都使用上面一个类Test的一个全局实例。那么,用C编写的本机方法代码是否可能是线程安全的呢?或者我是否需要像问题中提到的那样使其线程安全?
如果我为每个线程创建单独的Test类实例,然后调用本机函数怎么办?这会表现出线程安全吗?
感谢。
答案 0 :(得分:1)
将本机方法定义为公共本地synchronized int doSum(int a,int b)是否正确?
如果您希望它是一个采用两个整数参数并返回整数结果的同步方法,那就是正确的。只有你知道。
那么,用C编写的本机方法代码是否可能是线程安全的?
如果以这种方式实施它是可能的。没有看到代码就不可能说。
或者我是否需要像问题中提到的那样使其线程安全?
如果它的实现不是线程安全的,并且您的使用模式要求它是线程安全的,那么您需要使其成为线程安全的。这不是一个真正的问题。
答案 1 :(得分:0)
我对C中实现的Java方法一无所知,但是在C和Java中,没有显式同步就无法保证线程安全。两个线程可以同时执行相同的方法。
“线程安全”意味着一种方法可以在任何情况下容忍这种情况。想象一下,线程A执行方法的一半,然后暂停,而线程B执行其中一些,然后恢复...这可能导致很难诊断的错误,所以最好小心。
通常,如果方法正在读取或修改对象状态的任何部分,那么它应该被同步或保持为单个线程的本地。
关于这个话题有很多好的阅读。如果您有兴趣,我建议您阅读有关并发编程的介绍性书籍。 :)