1、定義
確保一個類只有一個實例,并且自行實例化,為整個系統(tǒng)提供實例
2妆丘、要點
從上面這句描述可以看出有三個要點,從具體實現(xiàn)來講這三個要點:
- 單例模式的類只提供私有的構(gòu)造函數(shù)
- 類定義中含有一個該類的靜態(tài)私有對象
- 該類提供了一個靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對象
3局劲、實現(xiàn)
3.1勺拣、餓漢式
public class HungrySingleton {
//構(gòu)造函數(shù)有private,防止通過new創(chuàng)建更多對象,確保只要一個對象
private HungrySingleton(){
}
//在類初始化時鱼填,已經(jīng)自行實例化,所以是線程安全的
private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton();
public static HungrySingleton getInstance(){
return HUNGRY_SINGLETON;
}
}
優(yōu)點:寫法簡單药有,線程安全
缺點:沒有懶加載的效果,如果沒有使用過的話會照成內(nèi)存浪費
可用性:可用
3.2苹丸、懶漢式(線程安全)
public class LazySingleton {
private LazySingleton() {
}
private static LazySingleton singleton = null;
//加上synchronized同步愤惰,線程安全
public synchronized static LazySingleton getInstance(){
if (singleton == null){
//在第一次調(diào)用getInstance()時才實例化,實現(xiàn)懶加載,所以叫懶漢式
singleton = new LazySingleton();
}
return singleton;
}
}
優(yōu)點:實現(xiàn)了懶加載效果谈跛,線程安全
缺點:效率低羊苟,使用synchronized會照成不必要的同步開銷,而且大部分情況下不需要使用同步
可用性:不推薦
3.3感憾、雙重檢查鎖定DCL
public class DCLSingleton {
//volatile 能夠防止代碼的重排序蜡励,保證得到的對象是初始化過
private volatile static DCLSingleton singleton;
private DCLSingleton() {
}
public static DCLSingleton getInstance(){
if (singleton == null){//第一次檢查令花,避免不必要的同步
synchronized (DCLSingleton.class){
if (singleton == null){//第二次檢查
singleton = new DCLSingleton();
}
}
}
return singleton;
}
}
優(yōu)點:實現(xiàn)懶加載效果,線程安全凉倚,效率較高
缺點:volatile影響一點性能兼都,高并發(fā)情況下有一定的缺陷,某些情況下DCL會失效稽寒,雖然概率較小扮碧。
可用性:推薦
3.4、靜態(tài)內(nèi)部類
public class StaticSingleton {
private StaticSingleton() {
}
//靜態(tài)內(nèi)部類
private static class SingleTonHolder{
private static final StaticSingleton singleton = new StaticSingleton();
}
public static StaticSingleton getInstance(){
//第一次調(diào)用getInstance方法時才加載SingletonHolder并初始化sInstance
return SingleTonHolder.singleton;
}
}
優(yōu)點:懶加載杏糙,線程安全慎王,效率高
可用性:推薦
3.5、枚舉單例
public enum EnumSingleton {
INSTANCE; //定義一個枚舉的元素宏侍,它就是Singleton的一個實例
public void whatTodo() {
}
}
優(yōu)點:寫法簡單赖淤,線程安全,能防止反序列化重新創(chuàng)建新的對象
缺點:可讀性低谅河,枚舉會比靜態(tài)常量多一點點內(nèi)存
可用性:可使用
4咱旱、場景
- 工具類對象
- 頻繁訪問數(shù)據(jù)庫或文件的對象
- 創(chuàng)建對象時耗時過多或者耗資源多的,又經(jīng)常使用到的對象
5绷耍、優(yōu)點
- 內(nèi)存中只有一個對象吐限,節(jié)省系統(tǒng)資源
- 避免對資源的多重占用,例如一個文件操作褂始,由于只有一個實例存在內(nèi)存中诸典,避免對同一資源文件的同時操作
6、缺點
- 單例對象如果持有context病袄,那么很容易引發(fā)內(nèi)存泄漏
- 單例一般沒有接口搂赋,很難拓展