單例模式可能是平常開(kāi)發(fā)中使用最多的模式了轩娶。
那么單例模式是怎么樣的:單例模式的類(lèi)必須保證只有一個(gè)實(shí)例存在疑务。多用于整個(gè)程序只需要有一個(gè)實(shí)例沾凄,通常很消耗資源的類(lèi),比如網(wǎng)絡(luò)請(qǐng)求知允,IO操作撒蟀,訪問(wèn)數(shù)據(jù)庫(kù)等。由于類(lèi)比較耗資源温鸽,所以沒(méi)必要讓它構(gòu)造多個(gè)實(shí)例保屯。
單例的定義
確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,并且自行實(shí)例化涤垫,向整個(gè)系統(tǒng)提供這個(gè)唯一實(shí)例姑尺。
單例的幾種實(shí)現(xiàn)方式
餓漢式:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance(){
return instance;
}
}
優(yōu)點(diǎn):
①線程安全
②類(lèi)加載時(shí)已經(jīng)創(chuàng)建好了一個(gè)靜態(tài)對(duì)象,調(diào)用時(shí)反應(yīng)快蝠猬。
缺點(diǎn):
①資源效率不高切蟋,可能沒(méi)有使用getInstance,但是其他途徑加載了
該類(lèi),這個(gè)實(shí)例依然會(huì)初始化榆芦。
懶漢式:
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static **synchronized** Singleton getInstance(){//注意同步
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
優(yōu)點(diǎn):
資源利用率高柄粹,延遲初始化,可使用類(lèi)其他靜態(tài)方法匆绣。
缺點(diǎn):
第一次加載慢驻右,多線程情況下不必要的同步開(kāi)銷(xiāo)增大。
雙重校驗(yàn)鎖:
public class Singleton{
private volatile static Singleton instance;//注意volatile 關(guān)鍵字
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
添加了volatile關(guān)鍵字犬绒,保證了執(zhí)行順序旺入。保證了高并發(fā)下會(huì)出現(xiàn)的問(wèn)題。
靜態(tài)內(nèi)部類(lèi):
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
}