單例模式
單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式喳坠,它提供了一種創(chuàng)建對(duì)象的最佳方式。
這種模式涉及到一個(gè)單一的類茂蚓,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象壕鹉,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供了一種訪問其唯一的對(duì)象的方式聋涨,可以直接訪問晾浴,不需要實(shí)例化該類的對(duì)象。
1.懶漢式 --- 靜態(tài)常量方式 (線程安全)
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
2.餓漢式 --靜態(tài)代碼塊方式 (線程安全)
public class Singleton{
private static Singleton instance;
static{
instance=new Singleton();
}
public static Singleton getInstance(){
return instance;
}
}
3.懶漢式 (線程不安全)
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
singletion=new Singleton();
}
return singletion;
}
}
4.懶漢式(線程安全 牍白,方法上加同步鎖)
獲取實(shí)例的getInstance方法上加了同步鎖脊凰,保證了多線程場(chǎng)景下的單例,效率會(huì)有折損
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
5.雙重校驗(yàn)鎖(線程安全茂腥,效率高)
此種實(shí)現(xiàn)不用每次都需要獲得鎖狸涌,減少獲得鎖和等待的事件
注意的volatile 關(guān)鍵字的使用,保證了各線程對(duì)singleton 靜態(tài)實(shí)例修改的可見性
public class Singleton{
public volatile static Singleton singleton;
private Singletion(){}
public Singleton getInstance(){
if(singleton==null){
if(synchronized(Singleton.class)){
if(slingleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
6.靜態(tài)內(nèi)部類實(shí)現(xiàn)單例 (線程安全最岗,效率高)
這種方式Singleton 類被裝載了帕胆,Instance 不一定被初始化,因?yàn)镾ingletonHolder 類沒有被主動(dòng)使用般渡,只有通過顯式調(diào)用getInstance 方法時(shí)懒豹,才會(huì)顯式裝載SingletonHolder類,從而實(shí)例化inatance;
注意內(nèi)部類SingletonHolder 要同static 進(jìn)行修飾其中的靜態(tài)變量INSTANCE 必須是final的
public class Singleton{
public class SingletonHolder{
public static final Singleton INSTANCE=new Singleton();
}
private Singeton(){}
public static final Singletion getInstance(){
return SingletonHolder.INSTANCE;
}
}