多線程併發下的單例模式多線程
很久沒寫點東西了,感受很對不住各位。今天有點心得正好和你們聊聊閒天。是關於單例模式在併發狀況下應該怎麼寫纔對,我仍是用.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;
}
}
這樣就能夠實現有且僅有一次初始化的機會。併發