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 回答