定義:
Ensure a class has only one instance, and provide a global point of access to it.(確保某一個(gè)類只有一個(gè)實(shí)例, 而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例晋渺。 )
實(shí)現(xiàn)方式很多,推薦使用:靜態(tài)內(nèi)部類方式(Holder)
1. 餓漢式
- 優(yōu)點(diǎn):沒(méi)有加鎖灭红,執(zhí)行效率會(huì)提高。
- 缺點(diǎn):類加載時(shí)就初始化摊册,浪費(fèi)內(nèi)存。
public class Singleton {
private static final Singleton mSingleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return mSingleton;
}
public void doSomething() {
System.out.println(this.hashCode());
}
}
2. 懶漢式
- 優(yōu)點(diǎn):第一次調(diào)用才初始化颊艳,避免內(nèi)存浪費(fèi)茅特。
- 缺點(diǎn):多個(gè)線程訪問(wèn)不安全
public class Singleton {
private static Singleton mSingleton;
private Singleton() {
}
public static Singleton getInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();
}
return mSingleton;
}
public void doSomething() {
System.out.println(this.hashCode());
}
}
3. 雙重檢查加鎖
- 優(yōu)點(diǎn):第一次調(diào)用才初始化忘分,避免內(nèi)存浪費(fèi)。
- 缺點(diǎn):必須加鎖synchronized 才能保證單例白修,但加鎖會(huì)影響效率妒峦。
public class Singleton {
private static volatile Singleton mSingleton;
private Singleton() {
}
public static Singleton getInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
if (mSingleton == null) {
mSingleton = new Singleton();
}
}
}
return mSingleton;
}
public void doSomething() {
System.out.println(this.hashCode());
}
}
4. 靜態(tài)內(nèi)部類方式(Holder)
推薦使用這種方式,其他方式都存在一定的缺點(diǎn),要么是資源要么是不安全
內(nèi)部類只有在外部類被調(diào)用才加載,產(chǎn)生SINGLETON實(shí)例兵睛;又不用加鎖肯骇。此模式有上述兩個(gè)模式的優(yōu)點(diǎn),屏蔽了它們的缺點(diǎn)祖很,是最好的單例模式笛丙。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTENCE = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.INSTENCE;
}
public void doSomething() {
System.out.println(this.hashCode());
}
}