0

マルチスレッド環境での JNI の実装について混乱しています。ネイティブ インターフェイスを表す、以下のような Java クラスがあります。

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

また、対応するネイティブ メソッドは c で実装されます。

さて、私の質問は、複数のスレッドがあり、たとえば 5 つあり、それらすべてが上記のクラス Test の 1 つのグローバル インスタンスを使用しているということです。では、C で記述されたネイティブ メソッド コードがスレッド セーフになる可能性はありますか? または、質問に記載されているようにスレッドセーフにする必要がありますか?

また、スレッドごとに Test クラスのインスタンスを個別に作成し、ネイティブ関数を呼び出すとどうなりますか? それはスレッドセーフに動作しますか?

ありがとう。

4

2 に答える 2

1

ネイティブ メソッドをパブリック ネイティブ同期 int doSum(int a, int b) として定義するのは正しいですか?

2 つの整数引数を取り、整数の結果を返す同期メソッドにしたい場合は正しいです。あなただけがそれを知っています。

では、C で記述されたネイティブ メソッド コードがスレッド セーフになる可能性はありますか?

そのように実装されていれば可能です。コードを見ないと何とも言えません。

または、質問に記載されているようにスレッドセーフにする必要がありますか?

実装がまだスレッドセーフになっておらず、使用パターンでスレッドセーフにする必要がある場合は、スレッドセーフにする必要があります。これは本当の質問ではありません。

于 2013-03-01T09:12:10.177 に答える
0

Cで実装されたJavaメソッドについては特に何も知りませんが、CとJavaの両方で個別に、明示的な同期なしではスレッドセーフの保証はありません。2 つのスレッドが同じメソッドを同時に実行する可能性があります。

「スレッド セーフ」とは、メソッドがすべての状況下でこれを許容できることを意味します。スレッド A がメソッドの半分を実行し、スレッド B がその一部を実行している間に一時停止され、その後再開されると想像してください。これは、診断が非常に難しいバグにつながる可能性があるため、注意が必要です。

一般に、メソッドがオブジェクトの状態の一部を読み取ったり変更したりする場合は、同期するか、単一のスレッドに対してローカルに保持する必要があります。

このトピックについては、多くの優れた読み物があります。興味があれば、並行プログラミングに関する入門書を手に取ることをお勧めします。:)

于 2013-03-01T08:02:58.157 に答える