2011-09-28 5 views
9

네이티브 코드에서 호출하려는 일부 (개인 정적) 동기화 된 메서드가있는 Java 클래스가 있습니다. 몇 가지 예제 코드로 내가access 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()의 동기화 된 속성에 의해 이미 적용됩니다. 코드를 다시 작성하는 데별로 관심이 없습니다. 이 문제를 해결할 수있는 몇 가지 솔루션을 생각해 볼 수는 있지만 네이티브 코드에서 호출되는 동기화 된 메서드를 사용하면 동작이 무엇인지 관심이 있습니다.

답변

6

Java 언어 사양의 8.4.3.6 synchronized Methods 섹션에서 동기화 된 메서드를 선언하면 메서드 내에서 동기화 된 블록을 추가하는 것과 동일한 효과가 있다고합니다.

+0

감사합니다. 동일한 효과를 가지도록 지정되었으므로 동일한 바이트 코드를 생성한다고 가정하므로 여기서는 MonitorEnter/MonitorExit가 필요하지 않습니다. –

0

당신이 SomeClass을 소유하고 있다면 당신은 ++ 단지

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

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

을 그냥 C에서 synchronizedMethod()를 호출 할 수 있습니다.

+0

물론, 그 대안 중 하나입니다. 내가 말했듯이, 나는 코드를 다시 작성하는 것에별로 관심이 없다. 무슨 일이 벌어지고 있는지 이해하고 싶습니다. –

3

아니요, 명시 적 MonitorEnter/MonitorExit은 필요하지 않습니다. The JNI guide에 따르면,

... Java 프로그래밍 언어로 동기화 구문을 표현하는 것이 바람직합니다. 예를 들어 정적 네이티브 메소드가 정의 클래스와 연관된 모니터를 입력해야하는 경우 네이티브 코드에서 JNI 레벨 모니터 동기화를 수행하는 것과 반대로 정적 동기화 네이티브 메소드를 정의해야합니다. 직접 스펙에서 논의되지 않은 (그리고 그 반대의 경우도 마찬가지) 네이티브 코드에서 자바 메소드를 호출하는 사용자의 경우, 반대 중 하나를 언급되지 않으므로 작동하는지 내가 을 가정 할지라도

비슷하게.

+0

감사합니다. 나는 이전에이 정보를 찾았지만 이것은 반대 방향이므로 확실하지는 않습니다. synchronized 메소드가 method() {synchronized (this) {method body}}와 비슷한 것으로 컴파일되면 아무런 문제가 없을 것으로 예상됩니다. 어떤 바이트 코드가 생성되었는지, 그리고 jni 호출의 엔트리 포인트가 정확히 무엇인지 확실하지 않습니다. –

+0

@Eric Moors : 절대적으로 동일한 바이트 코드인지 확인하려면 바이트 코드를 검사하는 것 외에는 다른 방법이 없습니다. 그러나 나는 그것이 사실이라고 거의 확신 할 것이다. –