概念:一套被反覆使用的,多數人知曉的,通過分類,編目的代碼設計經驗的總結安全
優勢: 都是優秀的使用案例函數
可提升代碼的重用性工具
使得代碼易於理解spa
保證代碼的可靠性線程
現實生活中有些場景中的對象只能是一個,如:地球,一個國家的皇帝,配偶等等.項目中也會有這樣的場景:配置文件,線程池,工具類,日誌等等.設計
單例模式就是保證整個項目(應用)中的某個實例有且只有一個日誌
爲何用單例模式?對象
使用單例模式是爲了不一些問題:如配置文件的讀取,當有多個實例去讀取時,當中的某一個修改了文件就會使得其餘實例讀取的內容不一致.例如線程池多個實例會過分的佔用資源等等.資源
單例模式經常使用的(基本的)有兩種:餓漢式和懶漢式get
//餓漢式
public class Sington1 {
//私有化構造函數
private Sington1(){
}
//建立對象
static Sington1 sington1 = new Sington1();
//提供訪問方法
public static Sington1 getInstance(){
return sington1;
}
}
//懶漢式
public class Sington2 {
private Sington2(){
}
private static Sington2 sington2 = null;
public static synchronized Sington2 getInstance(){
if (sington2 == null) {
sington2 = new Sington2();
}
return sington2;
}
}
線程不安全:當有多個線程同時調用實例的獲取方法,他們訪問時實例是沒有的,因此都能進入if模塊中建立實例,這時就會建立多個實例
經過上面的代碼能夠看出,單例模式類編寫的步驟:
1. 私有化構造方法,不容許外界隨意使用
2. 建立一個對象,將其私有化,不容許外界直接訪問
3. 提供一個訪問對象的方法
兩種方式的區別:
餓漢式在類加載的時候就建立了對象,全部加載的時候相對慢些;懶漢式在使用的時候纔開始建立對象,這時它比較慢些.餓漢式是線程安全的,懶漢式是線程不安全的,想要使其安全能夠加上關鍵字synchronized