2012-05-11 3 views
1
void Java_Package_Multithreading_againCallReadFile 
    (JNIEnv *env, jobject obj) { 

if((*env)->MonitorEnter(env,obj) == JNI_OK) { 
    printf("Now you can call the synchronised method !"); 
} else { 
    printf("oops ! Failed to acquire the lock."); 
    } 
} 

私は同期されたメソッドを呼び出すことができ、別のスレッドが使用している可能性があるかどうかをチェックしたいと思います。 MonitorEnterは実際に何を確認していますか?私はそのドキュメントを読んだが、それが何であるか理解していない。私がしたいことは、そのメソッドを呼び出すことが安全かどうかをチェックした後にsynchronizedメソッドを呼び出すことです。上記の方法は正しいとは思われません。なぜなら、ifステートメントが満たされていても、私は致命的なエラーが発生するからです。MonitorEnterの使用:synchronizedメソッドをどのように呼び出す必要がありますか?

答えて

0

MonitorEnterやっdocumentationによると(ENVを、OBJ)ので、あなたの例では、あなたが同期オブジェクトとしてthisを使用していて、これは私が考えて大丈夫でなければなりませんsynchronizatioin statement on object

synchronized (obj) { 
    ... // synchronized block 
} 

ネイティブJavaを使用してのようなものです。ただし、コール終了時にMonitorExit()を使用することを忘れないでください。

例外のスタックトレースは何ですか?

+0

[STACKTRACE NO PRINTED!](http://i47.tinypic.com/33pbu36.jpg) –

+0

しかし、hs_err_pid5536.logの内容は何ですか?そして、他のdll呼び出しは問題なく通常通りにやりますか? –

+0

[あなたはこのリンクをチェックすることができます。それは私を助けません](http://suhail03.my3gb.com/hs_err_pid5536.log) –

1

"私がしたいことは、 がそのメソッドを呼び出すことが安全かどうかをチェックした後、その同期メソッドを呼び出すことです。"

これは意味をなさない。ちょうどそれを呼び出します。メソッドがすでに同期されている場合は、値を何も追加しません。 'MonitorEnter'を呼び出すことは、そのメソッドを呼び出すことが安全であるかどうかをチェックしません。あなたが提供するオブジェクトに対するロックを要求します。

+0

しかし、寝ているか仕事をしている同期機能を呼び出すと致命的なエラーになります –

+0

@ program-o-steveどのような致命的なエラーですか? – EJP

関連する問題