使用MonitorEnter:我应该如何调用synchronized方法?

时间:2012-05-11 08:05:08

标签: java c multithreading java-native-interface

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语句,我也会遇到致命的错误。

2 个答案:

答案 0 :(得分:1)

  

“我想做的是,在检查后是否调用同步方法   称这种方法是安全的。“

这没有任何意义。打电话吧。如果方法已经同步,则不会添加任何值。调用'MonitorEnter'并不“检查是否可以安全地调用该方法”。它声称锁定了你提供的对象。

答案 1 :(得分:0)

根据documentation做MonitorEnter(env,obj)就像使用原生java synchronizatioin statement on object

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

所以在你的例子中你使用this作为同步对象,我认为这应该没问题。但是不要忘记在通话结束时使用MonitorExit()。

异常的堆栈跟踪是什么?