9

たとえば、次のような方法があります。

class MyClass
  self.perform(id)
    hash = doSomething(id)
    doMoreStuff(hash)
    return hash
  end
end

私の懸念は、複数のスレッドが を呼び出しているかどうかですMyClass.perform()。オブジェクトhashが別のスレッドによって上書きされる可能性はありますか? つまり、スレッド 1 が を呼び出しdoSomethingて、返されたハッシュを取得し{1 => 1}ます。しかし、その直後にスレッド 2 が呼び出さdoSomethingれ、 のハッシュが取得され{2 => 2}ます。今、何が起きた?スレッド 1 のハッシュは に変わり{2 => 2}ますか?

それとも、各スレッドは単独hashで動作し、他のスレッドが触れることはありませんか? doSomethingおよびdoMoreStuffはすでにスレッドセーフであると仮定します。

問題があれば、Rails 3.0 を使用しています。

4

2 に答える 2

18

your などのローカル変数hashは、周囲のメソッドの特定の呼び出しに対してローカルです。2 つのスレッドperformが同時に呼び出すことになった場合、各呼び出しは独自の実行コンテキストを取得し、インスタンス変数 ( @hash)、クラス変数 ( @@hash)、グローバル ( $hash) などの共有リソースが関係しない限り、それらは重複しません。同時実行の問題が発生する可能性があります。あなたのような単純なもので、スレッドに関して心配することは何もありませんperform

ただし、performがスレッドを作成していて、最終的に 内performにクロージャーができた場合、複数のスレッドがクロージャーを通じてキャプチャされた同じローカル変数を参照することになる可能性があります。したがって、スレッドを作成するときはスコープの問題に注意する必要がありますが、ローカル変数でのみ機能する単純なメソッドを扱う場合は心配する必要はありません。

于 2012-12-05T07:42:28.167 に答える
3

「クラスメソッド」(クラスオブジェクトのシングルトンメソッドにすぎない)であっても、インスタンスメソッドであることよりもスレッドセーフにはなりません。

于 2012-12-05T02:44:15.573 に答える