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実際にチェックするもの。私はそのドキュメントを読みましたが、それが何であるかを理解していません。私がしたいのは、そのメソッドを呼び出しても安全かどうかを確認した後、その同期メソッドを呼び出すことです。if上記の方法は、ステートメントが満たされている場合でも致命的なエラーが発生するため、正しくないようです。

4

2 に答える 2

1

「私がやりたいのは、そのメソッドを呼び出しても安全かどうかを確認した後、その同期メソッドを呼び出すことです。」

これは意味がありません。それを呼び出すだけです。メソッドが既に同期されている場合、値はまったく追加されません。「MonitorEnter」を呼び出しても、「そのメソッドを安全に呼び出すことができるかどうか」はまったくチェックされません。指定したオブジェクトのロックを要求します。

于 2012-05-11T10:05:16.253 に答える
0

ドキュメンテーションによると、 MonitorEnter(env, obj) を実行することは、オブジェクトでネイティブ Java Synchronizatioin ステートメントを使用するようなものです

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

あなたの例ではthis、同期オブジェクトとして使用していますが、これで問題ないと思います。ただし、呼び出しの最後に MonitorExit() を使用することを忘れないでください。

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

于 2012-05-11T08:34:42.973 に答える