我有一个 java 类,它有一些(私有(private)静态)同步方法,我也想从 native 代码调用这些方法。通过一些示例代码,我的意思变得更加清楚
public class SomeClass {
private static synchronized void method() {
//do something that needs synchronization
}
}
和相关的 native 代码 (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
}
所以我想知道我是否需要调用 MonitorEnter/MonitorExit,或者方法同步是否已由 SomeClass.method() 上的同步属性强制执行。 我对重写代码不太感兴趣。我可以想出一些解决方案来解决这个问题,但我对行为是什么感兴趣,给定一个从 native 代码调用的同步方法。
最佳答案
第8.4.3.6 synchronized Methods Java Language Specification 的声明说,将方法声明为同步与在方法中添加同步块(synchronized block)具有相同的效果。
关于java - 从 native 代码访问 java 同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7583531/