我有一個java類,有一些(私有靜態)同步方法,我也想從本地代碼調用。一些示例代碼,它變得更加清楚明白我的意思從本機代碼訪問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 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()的synchronized屬性強制執行。 我對重寫代碼沒有那麼感興趣。我可以考慮一些解決方法來解決這個問題,但是我對這個行爲是什麼感興趣,給定一個從本地代碼調用的同步方法。
謝謝!鑑於這些被指定具有相同的效果,我會假設它們生成相同的字節碼,所以MonitorEnter/MonitorExit在這裏不需要/多餘。 –