在學習單例模式前,不妨問自己幾個問題:單例模式是怎麼來的,單例模式怎麼去用?
單例模式是怎麼來的?
這就從設計模式起源開始,他是在實際實踐中遇到類似情況可以通用經驗所得到的總結,一般在其他模組或者方法多次呼叫類物件,也就是公共模組,用單例模式可以減少記憶體的消耗。
單例模式怎麼去用?
那這個容易,然後很快不到一分鐘寫完了。
1view codepublic
class
singletonex01 910
//防止使用new建構函式例項化物件
11private
singletonex01()
1415
public
static
singletonex01 getinstance()
2021
public
void
commonmethod()
2425 }
但這裡會有問題,啥問題呢?單執行緒中是沒問題,但是多執行緒會出現問題,假設兩個多執行緒a與b,a與b同時判斷singleton不為空,那會建立兩次,那對於這個問題需要使用同步鎖去解決了,下面改造下**。
publicview codeclass
singletonex01
//防止使用new建構函式例項化物件
private
singletonex01()
public
static
singletonex01 getinstance()
return
singleton;
}public
void
commonmethod()
}
這還不是最好的方法,如果是這樣的話每個執行緒都會使用同步鎖**塊,使用同步鎖其實是消耗資源的,因此,可以再改進下,在外面鎖再加個判斷,這樣一來提高了效率。(推薦這種寫法1)
另外,補充一下,例項變數加上volatile的意義。
建立物件可以分解為如下的3行偽**memory=allocate(); //1:分配物件的記憶體空間ctorinstance(memory); //2:初始化物件instance=memory; //3:設定instance指向剛分配的記憶體位址上面3行**中的2和3之間,可能會被重排序導致先3後2;
publicview codeclass
singletonex01
//防止使用new建構函式例項化物件
private
singletonex01()
public
static
singletonex01 getinstance()
}return
singleton;
}public
void
commonmethod()
}
其實還有另外兩種方法,一種是不管有沒有呼叫都例項化(俗稱惡漢式),另一種是靜態內部類的方法(推薦這種寫法2),執行緒安全而且高效
publicview codeclass
singletonex02
//防止使用new建構函式例項化物件
private
singletonex02()
public
static
singletonex02 getintance()
public
void
commonmethod()
}
publicview codeclass
singletonex03
public
static
void
main(string args)
//防止使用new建構函式例項化物件
private
singletonex03()
public
static
final
singletonex03 getintance()
public
void
commonmethod()
}
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...
單例模式 懶漢式單例模式
單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...