从本机代码访问java同步方法

从本机代码访问java同步方法,java,java-native-interface,synchronized,Java,Java Native Interface,Synchronized,我有一个java类,它有一些(私有静态)同步方法,我也想从本机代码中调用这些方法。通过一些示例代码,我的意思变得更清楚了 public class SomeClass { private static synchronized void method() { //do something that needs synchronization } } 以及相关的本机代码(C++) void someFunction(JNIEnv*env){ jclass someClass

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

public class SomeClass {
   private static synchronized void method() {
     //do something that needs synchronization
   }
}
以及相关的本机代码(C++)

void someFunction(JNIEnv*env){
jclass someClass=env->findClass(“someClass”);
jmethodID=env->GetStaticMethodID(jclass,“method”,“()V”);
env->MonitorEnter(jclass);//CallStaticVoidMethod(jclass,methodId);

env->MonitorExit(jclass);//如果你拥有
SomeClass
你可以

public class SomeClass {
private static synchronized void method() {
     //do something that needs synchronization
   }

private static void synchronizedMethod() {
     method();
   }
}

< > > C++调用.<代码>同步方法()/<代码> .p/> 不,不显式<代码> MonitorEnter <代码> >代码> MonitorExit <代码>。 …最好用Java编程语言表示同步构造。例如,如果静态本机方法需要进入与其定义类关联的监视器,则应定义静态同步本机方法,而不是在本机代码中执行JNI级监视器同步


即使您的案例是从本机代码调用Java方法(反之亦然)规范中没有直接讨论,也没有说明相反的内容,因此我假设它的工作原理类似。

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

谢谢。我以前发现过此信息,但这是相反的方向我不太确定。如果同步的方法被编译成类似method(){synchronized(this){methodbody}我也不希望出现问题。我只是不确定生成了什么字节码,jni调用的入口点到底是什么。@Eric Moors:要绝对确定它是相同的字节码,除了检查字节码之外没有其他方法。但我几乎敢打赌它是。当然,这是一种替代方法。就像我说的,我对重写代码不太感兴趣。我想了解发生了什么。谢谢!考虑到指定这些代码具有相同的效果,我将假设它们生成相同的字节码,因此这里不需要/冗余MonitorEnter/MonitorExit。
public class SomeClass {
private static synchronized void method() {
     //do something that needs synchronization
   }

private static void synchronizedMethod() {
     method();
   }
}