2011-12-21 12 views
2
public class Sample{ 

    private const ="constant string"; 

    public static object StaticMethod(args){ 

    var result= SomeOtherClass.StaticMethod(const,args); 

    return result; 

    } 

} 

このコードはスレッドセーフであるでしょうか?メンバ(const)を共有するクラスの静的メソッドはスレッドセーフですか?

+1

SomeOtherClass.StaticMethodは何をしていますか? –

+4

*有効な*コードを投稿するのに役立ちます。 –

+0

@JonSkeet:この場合、それは本当に役に立たないでしょう:) – SLaks

答えて

1

定数は、すべての手段によって、スレッドセーフですコードコンパイラをコンパイルするとconst変数のすべての参照が定数の実際の値に置き換えられます。それは "Constant String" です。定数変数の値を変更してコードを再コンパイルするまで。

私はC#コンパイラチームの主任開発者であるであるので、私はEric Lippertからリファレンスを与えました。不変のデータ構造の大いに喧伝給付のEric's blog

一つから

は は、彼らが「スレッドセーフ」であるということです。 書き込みできないので、 は書き込み操作が途中で中断されて スレッドスイッチになり、別のスレッドが矛盾したデータを読み取ることがありません 構造体。ただし、 のデータ構造では内容を変更することができないため、 の実装はスレッドセーフでなければならないと考えるのは間違いです。

2

スレッドの安全性を確保するために、特にSomeOtherClass.StaticMethodに副作用がある場合は、ロックを追加する必要があります。静的であっても自動的に関数がスレッドセーフになるわけではありません。

一般に、と表示されている場合は、スレッドの安全性に問題はありません(リソースの競合とは別に)。

1

ご質問はお答えできません。

完全に静的メソッドが何をするかによって異なります。
たとえば、静的メソッドがUIにアクセスする場合、ロック内から呼び出されてもスレッドセーフではありません。それらはコンパイル時に自分の実際の値ににコンパイルされ、それらの値に関係なく、どのように多くのスレッド:)

あなたは意志一度アクセスしているのプログラムの実行中に変更されることはありませんと