小编Eri*_*ors的帖子

从本机代码访问java synchronized方法

我有一个java类,它有一些(私有静态)同步方法,我想从本机代码调用.通过一些示例代码,我的意思变得更加清晰

public class SomeClass {
   private static synchronized void method() {
     //do something that needs synchronization
   }
}
Run Code Online (Sandbox Code Playgroud)

和相关的本机代码(C++)

void someFunction(JNIEnv * env) {
   jclass someClass = env->findClass("SomeClass");
   jmethodID methodId = env->GetStaticMethodID(jclass, "method", "()V");
   env->MonitorEnter(jclass); // <--- IS THIS NEEDED/ALLOWED
   env->CallStaticVoidMethod(jclass, methodId);
   env->MonitorExit(jclass); // <--- IS THIS NEEDED/ALLOWED
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道的是,我是否需要调用MonitorEnter/MonitorExit,或者是否已经通过SomeClass.method()上的synchronized属性强制执行方法同步.我对重写代码并不感兴趣.我可以想到一些解决方案来解决这个问题,但我感兴趣的是行为是什么,给定一个从本机代码调用的同步方法.

java java-native-interface synchronized

9
推荐指数
1
解决办法
3630
查看次数

标签 统计

java ×1

java-native-interface ×1

synchronized ×1