Tengo una clase java que tiene algunos métodos (privados estáticos) sincronizados a los que también quiero llamar desde código nativo. con un código de ejemplo se hace más claro lo que quiero deciracceda al método sincronizado de java desde el código nativo
public class SomeClass {
private static synchronized void method() {
//do something that needs synchronization
}
}
y el código nativa asociada (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
}
Así que lo que me pregunto es si tengo que llamar MonitorEnter/MonitorExit, o si la sincronización del método ya se aplica por el atributo sincronizado en SomeClass.method(). No estoy tan interesado en volver a escribir el código. Puedo pensar en algunas soluciones para evitar esto, pero estoy interesado en cuál es el comportamiento, dado un método sincronizado que se llama desde código nativo.
¡Gracias! Dado que se especifica que tienen el mismo efecto, supondré que generan el mismo código de bytes, por lo que MonitorEnter/MonitorExit no son necesarios/redundantes aquí. –