核心作用
- 保證一個類只有一個實例,并且提供一個訪問該實例的全局訪問點
單例模式的優(yōu)點
- 由于單例模式只生成一個實例,減少了系統(tǒng)性能開銷,當(dāng)一個對象的產(chǎn)生需要比較多的資源時,如讀取配置、產(chǎn)生其他依賴對象時,則可以通過在引用啟動時直接產(chǎn)生一個單例對象,然后永久駐留內(nèi)存的方式來解決
- 單例模式可以在系統(tǒng)設(shè)置全局的訪問點,優(yōu)化環(huán)境共享資源訪問,例如可以設(shè)計一個單例類,負(fù)責(zé)所有的數(shù)據(jù)表的映射處理
常見的五種單例模式實現(xiàn)方式
- 主要:
- 餓漢式(線程安全,調(diào)用效率高。但是,不能延時加載)
- 懶漢式(線程安全,調(diào)用效率不高。但是,可以延時加載)
- 其他:
- 雙中檢測鎖式(由于JVM底層內(nèi)部模型原因,偶爾會出問題[1])
- 靜態(tài)內(nèi)部類(線程安全,調(diào)用效率高,可以延時加載)
- 枚舉單例(線程安全,調(diào)用效率高,不能延時加載)
實例
- 餓漢式
/**
* 測試餓漢式
* @author admin
*
*/
public class SingletonPattern01 {
private static SingletonPattern01 st=new SingletonPattern01();
private SingletonPattern01(){//構(gòu)造器私有化
}
public static SingletonPattern01 getInstance(){
return st;
}
}
問題:如果只是加載本類,而不是調(diào)用getInstance(),甚至永遠(yuǎn)不會調(diào)用,則會造成資源浪費(fèi)。
- 懶漢式
/**
* 懶漢式
* @author admin
*
*/
public class SingletonPattern02 {
private static SingletonPattern02 st2;
private SingletonPattern02(){
}
public static synchronized SingletonPattern02 getInstance(){
if(st2==null){
return st2=new SingletonPattern02();
}
return st2;
}
}
資源利用率高了。但是每次調(diào)用getInstance()方法都要同步,并發(fā)效率低。
-
更新時間2018/8/5 ?