1、單例模式:某個類只能有一個實例,這個實例必須自行創(chuàng)建,必須提供對外提供唯一調(diào)用它的方法
? ? ? ? 單例模式的作用應(yīng)該是和同步鎖一樣,當(dāng)我對這個類進(jìn)行邏輯操作的時候,有且只有一個實例可以進(jìn)行,而不是在同一時刻出現(xiàn)大量操作它的步驟
????????①:懶漢式,字面理解 ?懶--說明除非當(dāng)前時刻必須要做的事情,是不會預(yù)先去做什么準(zhǔn)備,那么放在單例模式中,則代表在類加載的時刻,我是不會去實例化當(dāng)前類的對象的,只有調(diào)用了實例化的方法后才去做這件事情,見如下代碼:
public class SingleTonClass{
private static?SingleTonClass?singleTonClass = null;
//私有化構(gòu)造參數(shù)
private?SingleTonClass(){}
//對外提供一個實例化當(dāng)前單例的方法
public static synchronize SingleTonClass getInstance(){
if(singleTonClass == null){
singleTonClass = new?SingleTonClass();
}
return?singleTonClass;
}
}
對static的一些解釋,靜態(tài)static這個關(guān)鍵字不可以修飾頂級類(頂級類就是一個.Java文件最外層的類名,被稱為頂級類),只有內(nèi)部類是可以用static來修飾
②:餓漢式,相對于懶漢式,它會去預(yù)加載,也就是說在類加載的時候,它就會創(chuàng)建單例模式的實例
public class SingleTon{
//私有化構(gòu)造參數(shù)
private SingleTon(){}
private SingleTon singleTon = new SingleTon();
//對外提供調(diào)用單例模式的方法
public Static SingleTon genInstance(){
return singleTon;
}
}
③第三種方式,雙重鎖
//這個模式將同步內(nèi)容下方到if內(nèi)部,提高了執(zhí)行的效率,不必每次獲取對象時都進(jìn)行同步,只有第一次才同步,創(chuàng)建了以后就沒必要了。
//這種模式中雙重判斷加同步的方式,比第一個例子中的效率大大提升,因為如果單層if判斷,在服務(wù)器允許的情況下,
//假設(shè)有一百個線程,耗費的時間為100*(同步判斷時間+if判斷時間),而如果雙重if判斷,100的線程可以同時if判斷,理論消耗的時間只有一個if判斷的時間。
//所以如果面對高并發(fā)的情況,而且采用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式。
public class SingleTon{
private static SingleTon singleTon = null;
//私有化構(gòu)造方法
private SingleTon(){}
public static SingleTon genInstance(){
if(singleTon == null){
synchronize(SingleTon.class){
if(singleTon==null){
singleTon = newSingleTon();
}
}
}
return SingleTon;
}
}