建造型設(shè)計模式
簡要定義
確保一個類還有一個實例,能夠提供一個全局訪問點.
實現(xiàn)方法
public class Singleton{
private static Singleton unipueInstance;// 利用靜態(tài)變量記錄唯一實例
//其他有用變量
private Singleton(){} //把構(gòu)造器聲明為私有,只有Singleleton才能調(diào)用
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
多線程處理
多線程可能會實例化多個uniqueInstance
改善多線程
- "急切"創(chuàng)建實例,而不是延遲實例化(適用于創(chuàng)建和運行時該方面的負擔不太繁重)
public class Singleton{
private static Singleton unipueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
- 使用"雙重檢查加鎖"
public class Singleton{
private volatile static Singleton unipueInstance;
//其他有用變量
private Singleton(){} //把構(gòu)造器聲明為私有,只有Singleleton才能調(diào)用
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized (Singleton.class){
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
優(yōu)缺點
優(yōu)點
- 可以避免對共享資源的多重占用
- 因為單例模式在系統(tǒng)內(nèi)存中只存在一個對象, 因此可以節(jié)約系統(tǒng)資源.
- 使用方便
缺點
- 如果同一對象要在不同的用例場景發(fā)生變化是, 單例模式不能保存彼此狀態(tài)
- 由于構(gòu)造方法是私有的, 因此該類不能被繼承, 因此, 單例模式的拓展有一定的困難
- 介于某些語言(java c#)的運行環(huán)境提供了自動垃圾回收的技術(shù), 如果是實例化的對象長時間不被使用, 系統(tǒng)會默認銷毀對象, 并回收資源, 這樣會導致對象狀態(tài)的丟失.
注: 官方文檔: c# 內(nèi)存管理與垃圾回收機制 實現(xiàn)Dispose方法
CSDN C#對象銷毀與垃圾回收
使用場景
單例模式應(yīng)用的場景一般發(fā)現(xiàn)在以下條件下:
√叭恰(1)資源共享的情況下,避免由于資源操作時導致的性能或損耗等奏瞬。如上述中的日志文件,應(yīng)用配置并淋。
(2)控制資源的情況下县耽,方便資源之間的互相通信镣典。如線程池等。
具體應(yīng)用
- 管理器類
- 網(wǎng)頁計數(shù)器
- 多線程的線程池
關(guān)于volatile 關(guān)鍵字
Java提供了volatile關(guān)鍵字來保證可見性兄春。
當一個共享變量被volatile修飾時,它會保證修改的值會立即被更新到主存哑姚,當有其他線程需要讀取時,它會去內(nèi)存中讀取新值叙量。
而普通的共享變量不能保證可見性,因為普通共享變量被修改之后宛乃,什么時候被寫入主存是不確定的,當其他線程去讀取時析既,此時內(nèi)存中可能還是原來的舊值,因此無法保證可見性眼坏。