使用JNI橋接C++和Java時,我們總是希望避免不必要的複製。我發現GetPrimitiveArrayCritical
可能會給我們一個不復制數組的機會。但我不完全理解它的限制記載here:使用GetPrimitiveArrayCritical和Get <PrimitiveType> ArrayRegion之間的權衡是什麼?
調用GetPrimitiveArrayCritical後,本機代碼不應該的時間長一段時間它會調用ReleasePrimitiveArrayCritical之前運行。我們必須將這對函數中的代碼視爲在「關鍵區域」中運行。在關鍵區域內部,本機代碼不能調用其他JNI函數或任何可能導致當前線程阻塞並等待另一個Java線程的系統調用。 (例如,當前線程不能在另一個Java線程正在寫入的流上調用讀取)。
這些限制使得本機代碼更有可能獲得數組的未複製版本,即使虛擬機不支持鎖定。
我的問題是:
什麼是時間長時間的確切含義是什麼?
這是否意味着我們可以安全地調用其它的JNI函數或系統調用,將不會引起當前線程阻塞和等待另一個Java線程?
是GetPrimitiveArrayCritical線程安全的?
當使用GetPrimitiveArrayCritical而不是GetArrayRegion時,有什麼我應該知道的嗎?
這是我見過的最詳細的答案。感謝您的詳細解答! – keelar
@keelar不客氣!我花了很多時間研究它。我一直在討論這個問題,但有一個驚人的,巨大的阻力。庫作者不想接受不利的結論,JDK維護人員不認爲需要清理文檔。我寫信給了Shipilev,他拒絕做任何事情。我寫了Java規範勘誤郵件列表,誰沒有回覆。 –