2014-08-27 46 views
1

我想從線程中的Java應用程序加載本地庫,說每個線程Thread1,Thread2 ... ThreadN試圖加載相同的共享庫,但在Thread1之後加載該庫的其他線程在System.loadLibrary上被阻塞。任何人都可以請幫助我如何解決這個問題?系統loadLibrary在多線程中使用時掛起

感謝

回答

2

使用同步和標誌:

boolean isLoaded = false; 
Object lock = new Object(); 

void loadLibs(){ 
    sinchronized(lock){ 
     if(!isLoaded) { 
      //System.loadLibrary ... 
      isLoaded = true; 
     } 
    } 
} 

否則,你可以使用招王氏靜態構造函數,保證只被調用一次

static { 
    //System.loadLibrary ... 
} 
+1

Runtime.loadLibrary0(這是System.loadLibrary線索)已經與一個單例進行了同步,並且它包含了所有以前加載的用於防止雙重加載的庫的列表。運行時的Java Doc還聲明'如果這個方法被多次調用並使用相同的庫名稱,那麼第二個和後續的調用將被忽略。'。因此,看看你的建議是否解決了這個問題會很有趣,如果它確實存在,那麼它看起來就像是JVM庫中的一個bug。 – 2014-08-27 10:41:04

+1

重新'使用靜態構造函數保證只調用一次';這並非完全正確。每個加載類的類加載器只能調用一次。在大多數環境中,這兩條語句是相同的,但是在具有多個類加載器的環境中,這是造成混淆的一個很好的原因。對這條線進行微小的調整將會修正這條語句。 – 2014-08-27 10:46:58

+0

感謝Talex和Chris K,我的設計要求是在單獨的線程中加載庫,從而創建不同的實例來加載庫。因爲我認爲如果lib已經加載,那麼調用將會返回,但是我在System.loadLibrary中看到一些種族。 – 2014-08-27 11:33:03