複数のスレッドからアクセスされるシングルトンが使用され、シングルトン自体がスレッドセーフである場合、シングルトンがアクセスされたときにどのスレッドがブロックされますか?
たとえば、メインスレッド A があるとします。A は最初にシングルトン S にアクセスし、次に別のことを行います。
少し後、スレッド B がシングルトン S にアクセスします。
B が S にアクセスする場合、シングルトンは引き続きスレッド A のコンテキストにあり、スレッド A をブロックしますか、それともスレッド B のみをブロックしますか (そして実際にアクセスしようとしている他のスレッドは?)
-> accesses
A->S {}
A->X {}
B->S {
...
C-S
} - will B only block C or also A?
質問に答えるには: スレッドセーフなシングルトン (削除):
private static volatile Singleton instance;
private static object _sync = new Object();
private Singleton() {
// dosomething...
}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (_sync)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
(およびメソッドでロックが発生する)
そして、質問は主に次の点に固有のものです。ロックにより、複数のスレッドがコードの同じ領域にアクセスできないことがわかっています。私の質問は、次の点に固有のものです。
シングルトンが生成されたスコープの元のスレッドがロックを保持していない場合、シングルトン インスタンスがスコープ内で作成されたため、別のスレッドがロックにアクセスするとブロックされますか? シングルトンは元のスレッドの範囲でのみ実行されますか?