1:簡介
單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例。即一個類只有一個對象實例。
2:單例模式的特點
2.1、單例類只能有一個實例。
2.2、單例類必須自己創(chuàng)建自己的唯一實例。
2.3、單例類必須給所有其他對象提供這一實例。
3:最簡單的單例模式,也稱之為餓漢式
public class Singleton {
public static Singleton mSington = new Singleton();
private Singleton() {
// TODO Auto-generated constructor stub
}
}
4:懶漢式 (線程不安全),為什么叫做懶漢式,主要靜態(tài)實例一開始并沒有初始化,而是使用的時候才開始進行初始化。同時,下面這種寫法是不安全的。
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static Singleton getInstance(){
if (mSington == null) {
mSington = new Singleton();
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
5:這也是懶漢式,不過加了synchronized關鍵字,在多線程調(diào)用的時候是安全的,性能相對來說比較差。
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static synchronized Singleton getInstance(){
if (mSington == null) {
mSington = new Singleton();
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
6:變種餓漢式(使用靜態(tài)代碼塊去初始化),這種也是線程不安全的。
public static Singleton mSington ;// = new Singleton();
static{
mSington = new Singleton();
}
7:DCL單例(double check),這是單例99%的情況下都是線程安全的,不過在高并發(fā)下,也會導致異常。具體需要去分析字節(jié)碼加載進jvm的情況、
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static Singleton getInstance(){
if (mSington == null) {
synchronized (Singleton.class) {
if (mSington == null) {
mSington = new Singleton();
}
}
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
總而言之,到最后,單例模式無非就是在內(nèi)存中只有一份實例。