デフォルトでは、非静的メソッドは、複数のスレッドを介してアクセスされる場合、スレッドごとに変数の独自のインスタンスを持っているため、パブリック変数などが含まれていない場合はスレッド セーフになります。
一方、静的メソッドの変数はスレッド間で共有され、デフォルトでは非スレッド セーフになります。
たとえば、静的変数やメソッドをまったく持たないクラスがあるとします。
public class Profile {
private ConcurrentDictionary<int, int> cache =
new ConcurrentDictionary<int, int>();
public AddToCache() {
}
public RemoveToCache() {
}
public DoSomethingThatShouldBeThreadSafe() {
}
}
しかし、このクラスから静的オブジェクトを作成します。
public static Profile objProfile = new Profile();
そして、複数のスレッドで objProfile にアクセスします。
問題は、プロファイル クラスのメソッド、AddToCache、RemoveFromCache、および DoSomethingThatShouldBeThreadSafe が、objProfile を介して使用されたときにスレッド セーフになるかどうかです。クラスのインスタンス全体が静的であるため、変数が静的でなくても、それらの変数はスレッド間で共有されますか?