将本机方法定义为公共本地synchronized int doSum(int a,int b)是否正确?

时间:2013-03-01 07:38:51

标签: java c++ multithreading android-ndk java-native-interface

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

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

相应的本机方法在c。

中实现

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

  

将本机方法定义为公共本地synchronized int doSum(int a,int b)是否正确?

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

  

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

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

  

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

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

答案 1 :(得分:0)

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

“线程安全”意味着一种方法可以在任何情况下容忍这种情况。想象一下,线程A执行方法的一半,然后暂停,而线程B执行其中一些,然后恢复...这可能导致很难诊断的错误,所以最好小心。

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

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