ローカル変数は、メソッドごとに作成される(要求を仮定すると、再びスレッドで処理されています?)静的メソッド、クラスメソッド、非静的メソッド、またはスタンドアロン関数のいずれであっても、Javaと同じ方法で別々に呼び出します。これらのオブジェクトへの参照を明示的に外部にコピーしない限り、それらがメソッドに残って他のスレッドからアクセスできるようにするために、何もロックする必要はありません。 CoolClass
がインスタンス間の任意の共有状態を使用しない限り
例えば、これは安全である:オブジェクト参照は、スレッド(get_cool_inst
が何を行うかに依存する)の間で共有することができるので
def my_safe_method(*args):
my_cool_object = CoolClass()
my_cool_object.populate_from_stuff(*args)
return my_cool_object.result()
これは安全でない可能性があります。
def my_suspicious_method(*args):
my_cool_object = somewhere.get_cool_inst()
my_cool_object.populate_from_stuff(*args)
# another thread received the same instance
# and modified it
# (my_cool_object is still local, but it's a reference to a shared object)
return my_cool_object.result()
publish
株式参照場合、これは、あまりにも危険なことができます。
def my_suspicious_method(*args):
my_cool_object = CoolClass()
# puts somewhere into global namespace, other threads access it
publish(my_cool_object)
my_cool_object.prepare(*args)
# another thread modifies it now
return my_cool_object.result()
編集:あなたが提供したコードサンプルは完全にスレッドセーフで、@staticmethod
はその点で何も変更されませんでした。
メソッドスコープの変数では、ローカル変数を意味しますか?コードサンプルが役に立ちます。 – bereal
はい、申し訳ありませんが、メソッド内でローカル変数が割り当てられています。 – rutherford
もう別のことを明らかにする。それらの変数はローカルですが、それらはオブジェクト参照ですが、そうではありませんか?そうであれば、それらは作成され、方法の中で死ぬか、またはどこか他の場所へと/そこに保存されますか?このために – bereal