2011-06-28 13 views
0

私は次のメソッドを持っているとしましょう、メソッドのスレッドセーフですか?非同期静的メソッドとスレッドの安全

public static void forwardProcessingPerStudy(String str) 
{ 
     someNonStaticMethodProcessingOnObj(str); 
} 

すなわち2つの別個のスレッドは、互いに異なるSTRのインスタンス(例えば2つの完全に異なる文字列オブジェクト)との競合を渡すと同時に、上記の方法を実行できますか?

スレッドセーフな方法は、同期メソッドにする必要がありますか?

答えて

4

はい、2つの異なるスレッドは、同じ文字列参照または別のスレッドを使用して、そのメソッドを同時に実行できます。

あなたが同期する必要があるかどうかは、完全にはsomeNonStaticMethodProcessingOnObjに依存します。この名前は、メソッドを非staticメソッドと呼んでいることを示していますが、呼び出すインスタンスを指定しないと仮定すると、そうは思わしくありません。

メソッドの本体(および呼び出されるメソッド)が共有状態で何もしない場合は、心配する必要はありません。もしそうなら、あなたはもっと注意深く考える必要があります。

+0

ありがとう、someNonStaticMethodProcessingOnObj()メソッドであまり明確にしませんでした。 私はあなたが私が尋ねていたものに答えてくれたと思いますが、異なるスレッドから実行している場合、異なるStringオブジェクトがそのメソッド内で競合する可能性があります。 – james4563

+0

@James:文字列は不変でスレッドセーフなので、別の文字列は問題にならないでしょう。 –

+0

ありがとう、それは今完全に理にかなっています。 – james4563

0

はい。

しかし、この方法 someNonStaticMethodProcessingOnObjとの答えは異なる可能性があります。

0

このメソッドは、どのオブジェクトのステートフルな情報にもアクセスしないため、スレッドセーフです。

SomeNonStaticMethodProcessingOnObj()があるかどうかはわかりませんが、その名前は静的ではないが、どのインスタンスに対しても実行されていないことを示しています。

+0

どのような形式の同期もなしにスレッドセーフではないメソッドへの呼び出しを行う場合、メソッドはスレッドセーフですか? –

0

ここで私はあなたのためにこれを明確にするかもしれないいくつかの例を追加しました同様の質問への答えだ:それは、関連する上で同期するようなことは、外側のメソッドに同期を追加することが助けないかもしれないということです difference between synchronizing a static method and a non static method

クラスオブジェクト内部メソッドは他のものと同期する必要があるかもしれません。したがって、いくつかの注意が必要です。

+0

華麗で、とても役に立つ説明。ありがとうございました。 – james4563

関連する問題