天天看點

Java中的單例模式

單例模式是指某個類隻能被執行個體化一次,用來表示全局或系統範圍的元件,常用于日志記錄,工廠,平台元件管理等。單例模式看似簡單實際很難。

單例本身有多種實作方法,總體上可分為懶漢模式和餓漢模式兩種,懶漢模式相對簡單

私有構造函數在樓初始化時調用且隻調用一次,JVM保證在類完整初始化之後才會被其它多個線程調用。

餓漢模式常見線程安全的實作方式有三種:

雙重檢測加鎖模式,注意Java中new FooSingleton()操作實際是有配置設定執行個體記憶體、引用指向記憶體位址,初始化執行個體3個原子操作組成。除了雙重加鎖外,必須要将執行個體instance定義為volatile類型防止指令重排才能保證完全正确。

靜态内部類方法,内部類隻有在它的靜态方法、變量等被調用時才加載。

使用枚舉,根據Java語言規範8.9,“Enum的final克隆方法保證枚舉永遠無法被克隆,其特殊的序列化機制保證無法反序列化得到拷貝的對象。同時,還禁止利用反射對枚舉進行執行個體化。保證了這四個方面,在枚舉常量之外,就不會有其他同類的枚舉執行個體存在。”

要想真正實作單例,防止出現多個執行個體,還要考慮無法單例無法通過clone方法被克隆,無法通過序列化反序列化被拷貝,無法通過反射被重新序列化等。現在一般多推薦采用單例的寫法,不僅代碼簡潔,相對來說也能更好的預防上述問題。

http://www.importnew.com/16995.html