2016-08-31 5 views
0

私は異なるコンストラクタでインスタンス化できるC#クラスを持っていますが、それらのパラメータでしか動作しない他のクラスからも呼び出すことができる静的ヘルパメソッドがいくつか含まれています。静的でないクラスのスレッドのC#静的メソッドは安全ですか?

私は、異なるスレッドからそのようなメソッドへの並行呼び出しがスレッドセーフであるかどうか、つまり、静的メソッド内の変数がcall2によって変更される可能性がありますか?

public class AwesomeClass 
{ 
    /* constructors and stuff */ 

    public static bool HelperMethod(object o1) 
    { 
    string someString = ""; 
    Func<object, string> doSomething = (o) => { 

     string someOtherString == null; 
     if (someString.Length == 0) 
     { 
      /* time consuming process using o... frequently 
      changes someString and someOtherString */ 
     } 
     return someOtherString; 
    }; 
    return doSomething(o1).Length > 0 && someString.Length < 10; 
    } 
} 

例のsomeStringdoSomethingはまだスレッド1のために働いている間、私はトラブルになるだろうHelperMethodを呼び出すスレッド2によって変更することができれば。

+0

'someOtherString'はローカル変数です。話すスレッド安全性については何もありません。別のスレッドは 'someOtherString'の新しいインスタンスを作成します。したがって、実際には共有リソースはありません。 – user3185569

+0

どこにも渡さないとFuncを作成する目的は何ですか? – Jecoms

+0

私は自分の質問を説明するために作った例にすぎません...意味を成すものではありません。 –

答えて

5

静的メソッドでメンバ変数が変更されず、パラメータに変更メソッドが呼び出されない場合は、再入可能であり、したがってスレッドセーフです。

パラレルスレッドがパラメタと同じオブジェクトを持つメソッドを呼び出すときに、パラメタに変更操作を実行する静的メソッドは、スレッドセーフではありません。

たとえば、メソッドがメソッド、プロパティ、またはパブリック変数によってo1に変更された場合、メソッドはスレッドセーフではなくなります。

0

変数someStringsomeOtherStringは、コールにローカルであり、コール間で共有されません。これは、関数呼び出し自体があった場合と同様で、2番目の呼び出しの変数を変更しても最初の関数は変更されません。

安全でない可能性があるのはtime consuming process using o...です。操作をo1にすると、一度に複数のスレッドで安全に実行できない場合は、問題が発生する可能性があります。

3

HelperMethodは共有データにアクセスしないためスレッドセーフです。 someStringはローカル変数であり、メソッドが呼び出されるたびに再度割り当てられます。

この回答は、someStringがクロージャの一部であるという事実の影響を受けないことに注意してください。別のクロージャオブジェクト(someStringの特定のインスタンスを含む)は、HelperMethodへのすべての呼び出しでスタックに割り当てられます。

関連する問題