2013-02-02 61 views
1

我有一個本機庫,我想在我的Java應用程序中使用。多個線程將使用該庫以及多個Java進程也將使用同一個庫。該庫是用C語言編寫的,我目前正在使用Windows上的MinGW進行編譯。我應該使用什麼同步機制來同步非線程安全的本機庫?JNI共享庫不是線程安全的

在此先感謝!

+0

這將取決於圖書館的結構。它是完全不安全的(即沒有兩個同時發生的線程可以調用方法),或者僅僅對併發訪問相同的數據不安全?如果是這樣,普通數據可以封裝在一個Java對象中,還是在庫內保持靜態? –

+0

這是一個非常簡單的庫,它只提供一些功能,但是必須保持一個狀態。狀態只包含調用庫的每個客戶端的幾個變量。 – xSNRG

+0

@Joachim Isaksson:併發訪問不是線程安全的。客戶通常將信息傳遞給圖書館爲客戶存儲的圖書館 - 它跟蹤客戶所做的動作。所以原則上沒有太多的競爭條件可能性,但是,我只是想知道使用pthread-mutexes是否足以在哈希表中創建一個新條目,並在其中跟蹤客戶端操作。 – xSNRG

回答

3

最簡單的方法是製作所有Java本地方法static synchronized

+0

這對多個Java進程加載相同共享庫的情況有何幫助? – Java42

+0

@ Java42不同的進程將具有完全獨立的虛擬機,因此JNI線程安全問題(AFAIK是由共享訪問JVM資源引起的)不適用。事實上,我認爲共享庫不會因爲它們被多個進程加載而變得有問題(例如,幾乎每個進程都會加載一些現代操作系統上的系統調用庫),除非共享庫不安全地訪問系統資源。 –