總結(jié)
單例模式:確保系統(tǒng)中只有單個(gè)對(duì)象被創(chuàng)建
特點(diǎn)
- 類(lèi)只能有一個(gè)實(shí)例二鳄;(構(gòu)造器私有)
- 它必須自行創(chuàng)建這個(gè)實(shí)例;(自己編寫(xiě)實(shí)例化邏輯)
- 它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例媒怯;(對(duì)外提供實(shí)例化方法)
實(shí)現(xiàn)方式
單例模式有很多實(shí)現(xiàn)方式订讼,這里就寫(xiě)兩種最常用的實(shí)現(xiàn)方式
1、餓漢模式
/**
* 餓漢式實(shí)現(xiàn)單例模式
* 所謂餓漢模式就是在系統(tǒng)啟動(dòng)的時(shí)候就會(huì)創(chuàng)建這個(gè)類(lèi)的實(shí)例扇苞,但是有可能很長(zhǎng)時(shí)間
* 都不會(huì)使用這個(gè)實(shí)例欺殿,也就是說(shuō)這個(gè)實(shí)例屬于饑餓狀態(tài)
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
2、懶漢模式
使用懶漢模式的話鳖敷,為了保證線程安全和使用效率則必須使用雙重檢驗(yàn)?zāi)J紻CL(Double CheckLock)
/**
* DCL實(shí)現(xiàn)單例模式
*/
public class Singleton {
//volatile 關(guān)鍵字主要是為了防止指令重排祈餐,這里就不再細(xì)講,需要了解的同學(xué)可以自行查一下或者持續(xù)關(guān)注我
private static volatile Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
// 兩層判空哄陶,第一層是為了避免不必要的同步,如果已經(jīng)存在實(shí)例則不需要在進(jìn)入同步塊中操作
// 第二層是防止重復(fù)創(chuàng)建實(shí)例哺壶,當(dāng)多線程同時(shí)進(jìn)入同步代碼塊中后如果不判斷null屋吨,會(huì)創(chuàng)建多個(gè)實(shí)例
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
使用場(chǎng)景
- 多線程中的線程池
- 數(shù)據(jù)庫(kù)的連接池
這里會(huì)涉及到一個(gè)面試題:
spring是如何保證組件單例的?大家有時(shí)間可以查一下山宾,后面我也會(huì)進(jìn)行總結(jié)