2011-09-28 14 views
9

Yerel koddan da aramak istediğim bazı (özel statik) senkronize yöntemlere sahip bir java sınıfım var. bazı örnek kod ile benyerel koddan java senkronize yöntem erişimi

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

ve ilgili yerel kod (C++) ne anlama geldiğini daha netleşiyor

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 
} 

Peki merak ediyorum ben MonitorEnter/MonitorExit veya eğer aramanız gerekirse olduğunu yöntem eşitlemesi, zaten SomeClass.method() üzerindeki senkronize öznitelik tarafından zorlanır. Kodu yeniden yazmayı çok istemiyorum. Bu konuda çalışmak için birkaç çözüm düşünebilirim, ancak yerel koddan çağrılan bir senkronize yöntem göz önüne alındığında, davranışın ne olduğu ile ilgileniyorum.

cevap

6

Bölüm 8.4.3.6 synchronized Methods senkronize yöntem bildirerek yöntemi içinde senkronize bir blok yüklemek aynı etkiye sahip olduğunu söyler.

+0

Teşekkür ederiz! Bunların aynı etkiye sahip olduğu belirtilirse, aynı bayt kodunu oluşturduklarını varsayarız, bu nedenle MonitorEnter/MonitorExit burada/gereksizdir. –

0

Eğer SomeClass sahibi sen ++ sadece

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

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

yapmak ve sadece C synchronizedMethod() çağırabilir.

+0

Elbette, bu alternatiflerden biri. Yine de söylediğim gibi, kodu yeniden yazmayı çok istemiyorum. Neler olduğunu anlamak isterim. –

3

Hayır, açık MonitorEnter/MonitorExit gerekli değildir. The JNI guide,

'a göre Java programlama dilinde senkronizasyon yapılarını ifade etmek tercih edilir. Örneğin, statik bir yerel yöntemin tanımlayıcı sınıfıyla ilişkili monitöre girmesi gerekiyorsa, yerel kodda JNI düzeyindeki monitör senkronizasyonunun yerine statik senkronize bir yerel yöntem tanımlamanız gerekir. doğrudan spec ele alınmamıştır (ve tersi) yerel koddan bir Java yönteminin çağrılmasının davanız, zıt ya belirtilmemiştir, bu nedenle işe yaradığını ben varsayılabilir rağmen

benzer şekilde. Java Dil Şartnamenin

+0

Teşekkürler. Bu bilgiyi daha önce bulmuştum, ama zıt yön olduğundan emin değilim. Senkronize yöntem, method() {synchronized (this) {method body}} gibi benzer bir şeye derlenmişse, sorun da beklemezdim. Bunun için bayt kodunun ne olduğundan ve jni çağrısı için giriş noktasının tam olarak ne olduğundan emin değilim. –

+0

@Eric Moors: Aynı bayt kodu olduğundan kesinlikle emin olmak için bayt kodunu denetlemekten başka bir yol yoktur. Ama neredeyse bunun olduğuna bahse girerim. –