1
我想從線程中的Java應用程序加載本地庫,說每個線程Thread1,Thread2 ... ThreadN試圖加載相同的共享庫,但在Thread1之後加載該庫的其他線程在System.loadLibrary上被阻塞。任何人都可以請幫助我如何解決這個問題?系統loadLibrary在多線程中使用時掛起
感謝
我想從線程中的Java應用程序加載本地庫,說每個線程Thread1,Thread2 ... ThreadN試圖加載相同的共享庫,但在Thread1之後加載該庫的其他線程在System.loadLibrary上被阻塞。任何人都可以請幫助我如何解決這個問題?系統loadLibrary在多線程中使用時掛起
感謝
使用同步和標誌:
boolean isLoaded = false;
Object lock = new Object();
void loadLibs(){
sinchronized(lock){
if(!isLoaded) {
//System.loadLibrary ...
isLoaded = true;
}
}
}
否則,你可以使用招王氏靜態構造函數,保證只被調用一次
static {
//System.loadLibrary ...
}
Runtime.loadLibrary0(這是System.loadLibrary線索)已經與一個單例進行了同步,並且它包含了所有以前加載的用於防止雙重加載的庫的列表。運行時的Java Doc還聲明'如果這個方法被多次調用並使用相同的庫名稱,那麼第二個和後續的調用將被忽略。'。因此,看看你的建議是否解決了這個問題會很有趣,如果它確實存在,那麼它看起來就像是JVM庫中的一個bug。 – 2014-08-27 10:41:04
重新'使用靜態構造函數保證只調用一次';這並非完全正確。每個加載類的類加載器只能調用一次。在大多數環境中,這兩條語句是相同的,但是在具有多個類加載器的環境中,這是造成混淆的一個很好的原因。對這條線進行微小的調整將會修正這條語句。 – 2014-08-27 10:46:58
感謝Talex和Chris K,我的設計要求是在單獨的線程中加載庫,從而創建不同的實例來加載庫。因爲我認爲如果lib已經加載,那麼調用將會返回,但是我在System.loadLibrary中看到一些種族。 – 2014-08-27 11:33:03