singleton pattern
單例模式(singleton pattern):確保某乙個類只有乙個例項,向整個系統提供這個唯一例項,這個類稱為單例類,它提供全域性訪問的方法。單例模式是一種物件建立型模式。
單例模式是結構最簡單的設計模式一,在它的核心結構中只包含乙個被稱為單例類的特殊類。
單例模式的各種寫法,推薦使用列舉。
因為可以通過accessibleobject.setaccessbile
方法,使用反射呼叫私有構造器建立例項,所以需要在構造方法中,讓它在被要求建立第二個例項的時候丟擲異常。
/*
載入類時就初始化,如果不用浪費記憶體
*/public
class
eagersingleton
public
static eagersingleton instance()
}
/*
延遲載入,用到時再載入。
必須使用volatile關鍵字修飾,因為new物件操作不是原子性的,
1. 給singleton例項分配記憶體
2. 呼叫singleton()建構函式,進行初始化
3. 將msingle物件指向分配的記憶體空間
因為按照記憶體模型中線程工作記憶體回寫到主記憶體時2、3的步驟是不確定的,當3在前面發生時,即msingle不為null了,此時切換執行緒,得到的是未初始化的非空物件,使用時會出錯。這就是dcl(double check lock)失效問題。
使用volatile禁止指令重排,保證按順序執行,直接從主記憶體讀寫,就不會出錯了。
*/public
class
lazysingleton
}// 使用區域性變數,並不是必須的,但能提高效能。但並不是必須的
public
static lazysingleton instance()
}}return result;
}}
lazy initialization holder class
,也稱作initialize-on-demand holder
,延遲初始化。
/*
餓漢式浪費記憶體,懶漢式使用volatile造成效能損耗。所以:
使用holderclass包裹,既延遲載入,又不浪費效能
*/public
class
lodhsingleton
private
static
class
holderclass
public
static lodhsingleton instance()
}
public
enum enumsingleton
設計模式(四) 單例模式
單例模式屬於物件建立性質的模式,用於產生乙個物件的具體例項,並且可以確保系統中乙個類只能產生乙個例項。public class singleton public static singleton getinstance public class lazysingleton private stati...
JAVA設計模式(四)單例模式
size medium b 單例模式 b size 確保乙個類只有乙個例項,並提供乙個全域性訪問站點。類圖 img 1.執行緒不安全的單例模式 單例模式 執行緒不安全 public class singletontest public static singletontest getinstance...
JS 設計模式 四(單例)
單例是乙個全域性變數,使用單例可以更好的控制全域性變數,還可以利用分支技術來封裝瀏覽器之間的差異。網頁中使用全域性變數由於可以被重寫風險很大。所以使用單例會更好的控制全域性變數。單例模式多數都是在載入指令碼的時候被建立出來。不過對於一些使用方式單例適合在用到的時候被載入,所以需要乙個可以懶載入的單例...