1.單例模式
這種方式是最基本的實(shí)現(xiàn)方式,這種實(shí)現(xiàn)最大的問(wèn)題就是不支持多線程。
因?yàn)闆](méi)有加鎖 synchronized,所以嚴(yán)格意義上它并不算單例模式。
這種方式 lazy loading 很明顯,不要求線程安全,在多線程不能正常工作。
這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,
99% 情況下不需要同步。
優(yōu)點(diǎn) :第一次調(diào)用才初始化,避免內(nèi)存浪費(fèi)。
缺點(diǎn):必須加鎖 synchronized 才能保證單例,但加鎖會(huì)影響效率。getInstance() 的性能
對(duì)應(yīng)用程序不是很關(guān)鍵(該方法使用不太頻繁)。
描述:這種方式比較常用,但容易產(chǎn)生垃圾對(duì)象。
優(yōu)點(diǎn):沒(méi)有加鎖,執(zhí)行效率會(huì)提高。
缺點(diǎn):類(lèi)加載時(shí)就初始化,浪費(fèi)內(nèi)存。它基于 classloder 機(jī)制避免了多線程的同步問(wèn)題,
不過(guò),instance 在類(lèi)裝載時(shí)就實(shí)例化,雖然導(dǎo)致類(lèi)裝載的原因有很多種,在單例模式中大多
數(shù)都是調(diào)用 getInstance 方法, 但是也不能確定有其他的方式(或者其他的靜態(tài)方法)
導(dǎo)致類(lèi)裝載,這時(shí)候初始化 instance 顯然沒(méi)有達(dá)到 lazy loading 的效果。
- 雙檢鎖/雙重校驗(yàn)鎖(DCL,即 double-checked locking)
描述:這種方式采用雙鎖機(jī)制,安全且在多線程情況下能保持高性能。
getInstance() 的性能對(duì)應(yīng)用程序很關(guān)鍵。
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。