概念
java中單例模式是一種常見的設(shè)計模式跟衅,單例模式分三種:懶漢式模式,餓漢式模式播歼、登記式單例三種伶跷。
單例模式有以下特點:
- 單例類只能有一個實例;
- 單例類必須自己創(chuàng)建自己的唯一實例秘狞;
- 單例類必須給所有其他對象提供這一實例叭莫。
單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例烁试。在計算機系統(tǒng)中食寡,線程池、緩存廓潜、日志對象抵皱、對話框、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計成單例辩蛋。這些應(yīng)用都或多或少具有資源管理器的功能呻畸。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler悼院,以避免兩個打印作業(yè)同事輸出到打印機中伤为。每臺計算機可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信接口,以避免一個通信端口與同時被兩個請求同時調(diào)用绞愚⌒鸬椋總之,選擇單例模式就是為了避免不一致狀態(tài)位衩。
四種線程安全的java單例
public class Singleton1 {
private static final Singleton1 single = new Singleton1();
private Singleton1() {
}
public static Singleton1 getInstance() {
return single;
}
}
public class Singleton2 {
private static Singleton2 instance = null;
private Singleton2() {
}
public synchronized static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
public class Singleton3 {
private static Singleton3 instance = null;
private Singleton3() {
}
public static Singleton3 getInstance() {
if (null == instance) {
synchronized (Singleton3.class) {
if (null == instance) {
instance = new Singleton3();
}
}
}
return instance;
}
}
public class Singleton4 {
private Singleton4() {
}
private static final class SingletonHolder {
private static final Singleton4 INSTANCE = new Singleton4();
}
public static final Singleton4 getInstance() {
return SingletonHolder.INSTANCE;
}
}