標籤:餓漢式 tin 6.2 建構函式 虛擬 1.0 儲存 模式 用戶端
一個類的靜態屬性只會在第一次載入類時初始化靜態變數只初始化一次 懶漢式方式:
1 //懶漢式單例 2 public class Singleton1 { 3 // 4 定義一個變數儲存建立好的類執行個體 4 // 5 要在靜態方法中使用,所以需要加上static修飾 5 private static Singleton1 instance = null; 6 //1 私人化建構函式,在內部控制建立執行個體的數目 7 private Singleton1(){} 8 // 2 定義一個方法為用戶端提供類執行個體 9 // 3 需要定義成類方法,加static10 public static Singleton1 getInstance(){11 // 6 判斷儲存執行個體的變數是否有值12 if(instance == null){13 // 6.1 如果沒有,就建立一個類執行個體,賦給儲存類執行個體的變數14 instance = new Singleton1();15 }16 // 6.2 如果有值,就直接使用17 return instance;18 }19 }20 //沒有經過內部類處理,這種方式最主要的缺點就是一旦我訪問了Singleton1的任何其他的靜態域,21 //就會造成執行個體的初始化,而事實是可能我們從始至終就沒有使用這個執行個體,造成記憶體的浪費
不加同步的懶漢式是線程不安全的。
//餓漢式單例public class Singleton {private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; }}
餓漢式是安全執行緒的,因為虛擬機器只會裝載一次,在裝載類的時候不會發生並發。
沒有經過內部類處理,這種方式最主要的缺點就是一旦我訪問了Singleton1的任何其他的靜態域,就會造成執行個體的初始化,而事實是可能我們從始至終就沒有使用這個執行個體,造成記憶體的浪費。
改成使用靜態內部類作為單例
public class Singleton { //1 私人化建構函式,內部控制建立執行個體的個數 private Singleton(){} //2 定義方法為用戶端提供類執行個體 //3 需要定義成類方法,加static public static Singleton getIntance(){ return SingletonInstace.instance; } //靜態內部類作為執行個體,一個類的靜態屬性只會在第一次載入類時初始化 private static class SingletonInstace{ static Singleton instance = new Singleton(); }}
設計模式-單例模式