2012-05-11 43 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實際上檢查什麼。我已閱讀其文檔,但不明白它是什麼。我想要做的是,在檢查調用該方法是否安全之後,調用該同步方法。上述方法看起來不正確,因爲即使滿足if聲明,我也會遇到致命錯誤。使用MonitorEnter:我應該如何調用synchronized方法?

回答

0

根據documentation做MonitorEnter(ENV,OBJ)就像使用本地Java synchronizatioin statement on object

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

所以在您的例子中,你正在使用this作爲同步對象,這應該沒問題,我認爲。但是不要忘記在調用結束時使用MonitorExit()。

什麼是異常的堆棧跟蹤?

+0

[NO STACKTRACE GETS 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

相關問題