您好,登錄后才能下訂單哦!
定義:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。類圖如下:
代碼實現(xiàn)如下:
public class Singleton {
// 用靜態(tài)變量來記錄唯一的實例
private static Singleton instance;
/**
* 構(gòu)造方法私有化,防止被創(chuàng)建,只能類內(nèi)部能使用構(gòu)造器
*/
private Singleton() { }
/**
* 實例化對象,并返回這個對象
* @return
*/
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// 其他的方法
}
并發(fā)環(huán)境下上面的代碼會出現(xiàn)問題的,我們進一步修改,如下:
/**
* 實例化對象,并返回這個對象
* synchronized加鎖,可能對性能有影響哦
* @return
*/
public static synchronized SingletonThread getInstance() {
if (instance == null) {
instance = new SingletonThread();
}
return instance;
}
上面例子對性能很大的影響,那我們可以進一步改善嗎?
- 如果getInstance()的性能對應(yīng)用程序不是很關(guān)鍵,就什么都別做,不要改善了
- 使用“急切”創(chuàng)建實例,而不用延遲實例化的做法,代碼如下:
public class Singleton3 {
// 靜態(tài)屬性,類加載時初始化的,JVM保證唯一
private static Singleton3 instance = new Singleton3();
private Singleton3() { }
public static Singleton3 getInstance() {
return instance;
}
}
- 使用“雙重檢查加鎖”,在getInstance()中減少使用同步,不適合JDK1.4之前的版本,代碼如下;
public class Singleton4 {
// 用靜態(tài)變量來記錄唯一的實例, volatile多線程環(huán)境下保用最新的值
private volatile static Singleton4 instance;
/**
* 構(gòu)造方法私有化,防止被創(chuàng)建,只能類內(nèi)部能使用構(gòu)造器
*/
private Singleton4() {
}
/**
* 實例化對象,并返回這個對象
* @return
*/
public static Singleton4 getInstance() {
if (instance == null) {
synchronized (Singleton4.class) {
if (instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
// 其他的方法
}
注意:有多個類加載器時,單利可能產(chǎn)生多個哦,這個要注意哦。
單例模式的應(yīng)用場景:
- 應(yīng)用中某個實例對象需要頻繁的被訪問。
- 應(yīng)用中每次啟動只會存在一個實例。如賬號系統(tǒng),數(shù)據(jù)庫系統(tǒng)。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。