2013-03-01 47 views
0

我對多線程環境下的JNI實現感到困惑。我有一個Java類如下,代表原生接口:將本地方法定義爲公共本機synchronized int doSum(int a,int b)是否正確?

public class Test { 
    public native int doSum(int a, int b); 
} 

而相應的本地方法在c中實現。

現在,我的問題是,我有多個線程,說5,並且他們都使用上面的類Test的一個全局實例。那麼,用C編寫的本地方法代碼是否可能是線程安全的呢?或者我是否需要像提到的問題那樣使線程安全?

如果我爲每個線程創建Test類的單個實例,然後調用本機函數呢?這會表現線程安全嗎?

謝謝。

+0

如果不知道該方法的實施情況,我們無法判斷。如果實現是線程安全的,則不需要同步。如果它不是線程安全的,那麼同步可以使它線程安全或不安全。這完全取決於方法的代碼。 – 2013-03-01 07:45:49

回答

0

對於在C語言中實現的Java方法我沒有任何具體的瞭解,但是在C和Java中,都沒有明確的同步保證線程安全。兩個線程可以同時執行相同的方法。

「線程安全性」意味着一種方法在任何情況下都可以容忍這種情況。想象一下,線程A執行一半的方法,然後在線程B執行其中的一部分時暫停,然後恢復......這會導致很難診斷的錯誤,所以最好小心。

一般來說,如果該方法正在讀取或修改對象狀態的任何部分,那麼它應該被同步或保持在單個線程本地。

關於這個話題有很多很好的閱讀。如果你有興趣,我建議你選擇一本關於併發編程的入門書。 :)

1

是否將本地方法定義爲公共本機synchronized int doSum(int a,int b)?

如果您希望它是一個同步方法,它接受兩個整數參數並返回整數結果,這是正確的。只有你知道這一點。

那麼,是不是有可能是本地方法的代碼,用C編寫的,將是線程安全的?

這是可能的,如果它被實現的話。無法看到代碼就說不出來。

或者做我需要使它像問題中提到的線程安全嗎?

如果它的實現不是線程安全的並且您的使用模式要求它是線程安全的,那麼您需要使其成爲線程安全的。這不是一個真正的問題。

+0

我的真正需求是將對象地址(指針)作爲整數參數傳遞給本地函數,如int doSum(Math * objPtr,jint a,jint b)。並在doSum(...)的主體中,我會做objPtr-> Sum(a,b)。你對這種結構的建議是什麼?沒有定義同步,它會是線程安全的嗎? – sam18 2013-03-01 10:53:35

+1

你一直在問只有你知道答案的問題。一個方法是否是線程安全的取決於它內部的內容。 – EJP 2013-03-01 11:33:40

相關問題