1

おそらく私が持っている質問については、私のソリューションに実装するには、より説得力のある答えが必要です。私の理解が正しいかどうかはわかりません。実装の詳細は次のとおりです。

クラスのメイン メソッドで、クラス オブジェクト C が作成され、整数をパラメーターとして受け取るインスタンス メソッドを呼び出します。

public <AnyClass> MyMethod(int classVar)
{
    return new <AnyClass>(classVar);
    // Can have more implementation, using the parameter passed
}

主に、同じクラスオブジェクトを使用して、このメソッドを複数のスレッドで呼び出す必要があります。パラメーターは、スレッドの実行を開始する for ループによって提供される値になります。現在、メモリ内で同じメソッドを実行していますが、これには何らかのロックが必要ですか。私の見解では、いいえ、テストしましたが、理論的にはわかりません.異なるスレッドがお互いのパラメーター値を台無しにしない理由は、私の実装ではそうではないようです.

私が保証できない唯一のことは、どのスレッドが最初にアクセスして戻るかということです。それは順序どおりではないためですが、気にしなければ、この実装は正しいです。

これは問題をスタンドアロンで説明する試みであることに注意してください。私は複雑なプロジェクトの一部として同様の実装を行っています。

どんな提案/指針も素晴らしいでしょう。説明が必要な場合はお知らせください。

4

3 に答える 3

2

いいえ、ここでは何もロックする必要はありません:

  • コードは読み取り専用なので、2 つのスレッドが同じコードを実行しても問題ありません。
  • 各スレッドには独自のスタックがあるため、スレッドが互いのスタックベースの変数を台無しにすることはありません。

ただし、2 つのスレッドが同じオブジェクトを認識し、少なくとも 1 つのスレッドがそれを変更する可能性がある場合は、そのオブジェクトをロックする必要があります。

于 2013-09-02T08:49:56.563 に答える
1

あなたは絶対に正しいです!

いかなる種類のロックも必要ありません。メソッド内のコードがパラメーターを介して渡されたもの以外のものにアクセスする場合は、ロックが必要です。コードがインスタンス変数またはシングルトン オブジェクトにアクセスする場合は、ロックが必要になる場合があります。コードがこれらの外部データに読み取り専用でアクセスする場合、ロックする必要がないからかもしれません

基本的に、2 つの並列スレッドがそれらの間で共有されているデータにアクセスして変更 (変更) する場合にのみ、ロックが必要です。

メソッド引数に関しては、それらは各スレッドに固有です。2 つのスレッドが同じメソッドを異なる引数で同時に呼び出すことができます。両方のスレッドが正常に動作します。コードが引数で取得したデータのみを操作するように制限されている限り。

サンプル コードでは、shared-dataにアクセスしていないため、ロックは必要ありません。あなたが十分に確信していることを願っています。

于 2013-09-02T09:01:44.100 に答える