場(chǎng)景
保證一個(gè)類只有一個(gè)實(shí)例搭综,并且解決了此類被頻繁的創(chuàng)建及銷毀。
解讀
這是設(shè)計(jì)模式中最簡(jiǎn)單划栓,也可能是最頻繁使用的一種設(shè)計(jì)方法兑巾。在程序中,難以避免的會(huì)出現(xiàn)很多單例出現(xiàn)的場(chǎng)景忠荞。
實(shí)現(xiàn)關(guān)鍵
1:構(gòu)造方法私有
2:提供一個(gè)靜態(tài)方法蒋歌,用于獲取唯一實(shí)例
3:提供私有變量帅掘,保存當(dāng)前實(shí)例
Singleton
1:懶漢方式
實(shí)現(xiàn)簡(jiǎn)單,懶加載堂油,但線程不安全
public class Singleton {
private static Singleton instance;
//構(gòu)造方法私有
private Singleton (){}
//提供一個(gè)供訪問(wèn)的靜態(tài)方法修档。用于獲取實(shí)例。
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2:懶漢方式
實(shí)現(xiàn)簡(jiǎn)單府框,懶加載吱窝,線程安全。
備注:加鎖會(huì)影響效率迫靖。
public class Singleton {
private static Singleton instance;
//構(gòu)造方法私有
private Singleton (){}
//提供一個(gè)供訪問(wèn)的靜態(tài)方法院峡。用于獲取實(shí)例。使用synchronized鎖
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3:餓漢方式
實(shí)現(xiàn)簡(jiǎn)單系宜,線程安全照激。 但容易產(chǎn)生垃圾對(duì)象。
public class Singleton {
private static Singleton instance = new Singleton();
//構(gòu)造方法私有
private Singleton (){}
//提供一個(gè)供訪問(wèn)的靜態(tài)方法盹牧。用于獲取實(shí)例俩垃。
public static Singleton getInstance() {
return instance;
}
}
4:雙鎖
實(shí)現(xiàn)復(fù)雜,懶加載欢策,在多線程中工作很出色吆寨。
public class Singleton {
//volatile鎖變量
private volatile static Singleton singleton;
//構(gòu)造私有
private Singleton (){}
//提供一個(gè)供訪問(wèn)的靜態(tài)方法。用于獲取實(shí)例踩寇。
public static Singleton getSingleton() {
if (singleton == null) {
//當(dāng) singleton 為null 的時(shí)候啄清,才鎖住。
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}