私はネイティブコードからも呼び出すいくつかの(プライベートな静的な)同期メソッドを持つ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はここでは不要です。 –