所有類都有構造方法穆碎,如果不編寫則系統(tǒng)默認生成空的構造方法丧荐,若有顯示定義的構造方法万栅,默認的構造方法就會失效未斑。
將構造方法寫成是private的,那么外部程序就不能用new來實例化它了。
單例模式: 保證一個類僅有一個實例溢豆,并提供一個訪問它的全局訪問點蜒简。
通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象漩仙。一個最好的辦法就是搓茬,讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例可以被創(chuàng)建队他,并且它可以提供一個訪問該實例的方法
單例模式因為類封裝它的唯一實例卷仑,這樣他可以嚴格的控制客戶怎樣訪問它以及何時訪問它。簡單地說就是對唯一實例的受控訪問漱挎。
多線程時的單例模式
1.懶漢模式
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new singleton();
return singleton;
}
}
這種寫法只能在單線程下使用系枪,如果是多線程,可能發(fā)生一個線程通過并進入了if (singleton == null)判斷語句塊磕谅,但還未來得及創(chuàng)建新的實例時私爷,另一個線程也通過了這個判斷語句,兩個線程最終都進行了創(chuàng)建膊夹,導致多個實例的產生衬浑,所以在多線程環(huán)境下必須摒棄此方式
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
這種寫法通過給getInstance()
方法添加了synchronized
關鍵字,迫使每個線程在進入這個方法前放刨,要先等候別的線程離開該方法工秩,即不會有兩個線程可以同時進入該方法執(zhí)行new Singleton()
,從而保證了單例的有效进统,但它的致命缺陷是效率太低了助币,每個線程每次執(zhí)行getInstance()
方法獲取類的實例時,都會進行同步螟碎,而事實上實例創(chuàng)建完成后眉菱,同步就變?yōu)椴槐匾拈_銷了,這樣做在高并發(fā)下必然會拖垮性能掉分。
2.雙重檢查鎖定(Double Check Lock) 簡稱:DCL
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
synchronized(Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
此方法的Double-Check
體現在進行了兩次if (singleton == null)
的檢查俭缓,這樣即同步代碼塊保證了線程安全,同時實例化的代碼也只會執(zhí)行一次酥郭,實例化后同步操作不會再被執(zhí)行华坦,從而效率提升很多。
Android中鼎鼎大名的Universal Image Loader和EventBus都是采用了這種方式
public class SpHistoryStorage {
private Context context;
private static SpHistoryStorage instance;
private SpHistoryStorage(Context context) {
this.context = context.getApplicationContext();
}
public static synchronized SpHistoryStorage getInstance(Context context) {
if (instance == null) {
synchronized (SpHistoryStorage.class) {
if (instance == null) {
instance = new SpHistoryStorage(context);
}
}
}
return instance;
}
}
這是我在看別人的代碼的時候不从,人家這樣寫的惜姐。
后面的部分我都是看的這篇文章潛談單例模式這篇文章寫的很詳細