我想弄清楚單身模式設計。我想爲我的單例類中的每個線程創建分離的實例。所以我在下面提供了兩個設計。C#單線程模式設計ThreadStatic
它正在
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Console.ReadLine();
}
}
public sealed class SingletonClass
{
[ThreadStatic]
private static SingletonClass _instance;
public static SingletonClass Instance
{
get
{
if (_instance == null)
{
_instance = new SingletonClass();
}
return _instance;
}
}
private SingletonClass()
{
}
}
它不工作(投擲NullReferenceException異常並沒有被創建的實例。)
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Console.ReadLine();
}
}
public sealed class SingletonClass
{
[ThreadStatic]
private static SingletonClass _instance = new SingletonClass();
public static SingletonClass Instance
{
get
{
return _instance;
}
}
private SingletonClass()
{
}
}
我真的很奇怪,爲什麼不創建一個實例爲第二個設計。有人可以解釋一下嗎?
C#編譯器生成一個靜態構造函數以實現該變量的初始化。 CLR很難保證它只運行一次。你需要'new'語句多次運行。 –
我相信,即使這種方法奏效,或者你已經開始工作,這已經不再是單身。單線程應該是單線程而不是單線程。 – CodingYoshi
'CodingYoshi'在單例描述中沒有任何地方表明它不能是每個線程。在其他語言前。 'D'對於每個線程來說它是完全正常的。因爲默認情況下,一切都是線程本地的。 – Bauss