多線程併發下的單例模式
好久沒寫點東西了,感覺很對不住各位。今天有點心得正好和大家聊聊閒天。是關於單例模式在併發情況下應該怎麼寫纔對,我還是用.net語言來說這些。
首先,我們都知道單例模式,別說你不知道。
代碼如下:
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
public Singleton GetInstance()
{ return instance == null ? new Singleton() : instance; }
}
但是這個有問題了,多線程下,怎麼能保證從instance == null?到new Singleton() : instance之間沒有別的線程在操作呢?現在的代碼明顯滿足不了這個情況,而這在高併發下顯然是可以出現的。那就想想辦法唄,例如我們使用.net中的lock來做修改。
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
private static object _lock = new object();
public Singleton GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{ instance = new Singleton(); }
}
}
return instance;
}
}
這樣就可以實現有且僅有一次初始化的機會。