0

この動作をすることは可能ですか:

1 つのスレッド (T1) が何らかのメソッドを呼び出します。たとえば、compute(10);

その関数がまだ実行されている間に、別のスレッドがそれを (他のパラメーターを使用して) 再度呼び出します。たとえば、compute(20);

メソッドの場合

public int compute(int i) {
    return i+20;
}

各スレッドは正しい結果を取得しますか?

20T1 が を取得し、T2 が を取得することを期待しています40

4

3 に答える 3

1

短い答え、はい。各スレッドは、メソッドで使用される独自のデータ スタックを取得します。これは、他のスレッドとは完全に分離されています。データ (クラス レベルの変数など) がスレッド間で共有されている場合にのみ、競合について心配する必要があります。

于 2013-02-10T22:54:47.787 に答える
1

ローカル変数のみを使用するため(メソッド パラメーターはローカルです)、はい、安全です。

public class Computer {
    public int compute(int i) {
        return i+20;
    }
}

インスタンス変数または静的変数を使用する場合は、synchronizedすべての変数readとto 変数を使用する必要がwriteあります。

public class Computer {
    private int increment;

    public synchronized int compute(int i) {
        return i+increment;  // <-- reads increment
    }

    private synchronized void setIncrement(int increment) {
         this.increment = increment;  // <-- writes increment
    }
}
于 2013-02-10T23:04:34.823 に答える
0

computeメソッドの実装が次のとおりであると仮定します。

int compute(int i) {
  return i + 20;
}

次に、このメソッドは共有状態を使用しないため、各スレッドは正しい結果を取得します。

于 2013-02-10T22:55:53.270 に答える