public class Singleton
{
// 因建立物件需要花費許多資源,此一開始就不建立物件
private static Singleton instance;
// [多執行緒] 建立一個靜態惟獨的行程輔助物件
private static object sync = new object();
private Singleton()
{
// 這裡面跑很多 Code
// 建立物件需要花費許多資源
}
public static Singleton getInstance()
{
// 1. 第一次被呼叫的時候,instance為null,要建立物件
// 2. 判斷實體是否存在,不存在再加鎖處理
if (instance == null)
{
// [多執行緒] 加鎖建立物件,只有一個執行緒可以進入
lock(sync)
{
// [多執行緒] 雙重鎖定
// 當兩個執行緒調用 getInstance
// 他們都可以夠過第一重 instance == null
// 由 lock 機制,這兩個執行緒只能一個進入,另一個在外排隊等候
// 其中一個進入並出來後,另一個才能進入
// 如沒有第二重 instance == null
// 第一個執行緒建立實體,第二個執行緒還是可以繼續在建立新的實體
if(instance == null)
{
instance = new Singleton();
}
}
}
// 已經有物件存在,直接回傳這個物件
return instance;
}
}
Ref:
- 7 天學會設計模式-設計模式也可以這樣學
- 大話設計模式
沒有留言:
張貼留言