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
语句,我也会遇到致命的错误。
答案 0 :(得分:1)
“我想做的是,在检查后是否调用同步方法 称这种方法是安全的。“
这没有任何意义。打电话吧。如果方法已经同步,则不会添加任何值。调用'MonitorEnter'并不“检查是否可以安全地调用该方法”。它声称锁定了你提供的对象。
答案 1 :(得分:0)
根据documentation做MonitorEnter(env,obj)就像使用原生java synchronizatioin statement on object
synchronized (obj) {
... // synchronized block
}
所以在你的例子中你使用this
作为同步对象,我认为这应该没问题。但是不要忘记在通话结束时使用MonitorExit()。
异常的堆栈跟踪是什么?