从本机代码访问java synchronized方法

Eri*_*ors 9 java java-native-interface 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属性强制执行方法同步.我对重写代码并不感兴趣.我可以想到一些解决方案来解决这个问题,但我感兴趣的是行为是什么,给定一个从本机代码调用的同步方法.

qbe*_*220 6

8.4.3.6同步 Java语言规范的方法说,声明同步方法与在方法中添加同步块具有相同的效果.