[设计模式笔记]3.单例模式
單例類只能有一個實例
單例類必須自己創建自己的唯一實例
單例類必須提供給所有其他對象這個實例
?
單例類有私有的構造方法和本身的一個靜態實例對象
單例類向外界提供一個可訪問的靜態方法,供外界獲取它的靜態實例。
目的:保證一個類有且僅返回這一個實例對象。
解決:一個全局使用的類頻繁地創建和銷毀。
構造方法是私有的決定了外界無法調用構造方法創建實例,必須通過單例類提供的靜態方法獲取唯一的類靜態實例。
單例模式的幾種實現方式:
1.????懶漢式,線程不安全
Lazy初始化:是
????? ?? 多線程安全:否
?????? ?? 嚴格來說不算單例模式。
Public static getInstance() { if(instance == null) {instance = new SingleObject(); } Return instance; } 2.? ? 懶漢式,線程安全Lazy初始化:是
線程安全:是
優點:第一次調用才生成實例,避免浪費內容
缺點:必須加鎖synchronized才能保證單例,加鎖會影響效率
Public class SingleObject {Private static SingleObject instance;Private SingleObject() {}Public static synchronized SingleObject getInstance() {If(instance == null) {Instance = new SingleObject(); } Return instance; } }3.? ?餓漢式
Lazy初始化 否
線程安全 是
優點 沒有加鎖,提高效率
缺點 類加載時就生成實例,浪費內容
實質 基于classloder機制避免了多線程同步問題,產生類裝載的情況不少,但大多是調用單例的getInstance方法,也存在其他例如調用其他靜態方法的情況,這種情況下顯然沒達到lazyload的效果
Public class SingleObject {Private static SingleObject instance = new SingleObject()Private SingleObject() {} Private static SingleObject getInstance() {Return instance; } Public void showMsg() {System.out.println(“show message”); } }4.????雙檢鎖
Lazy 初始化是
線程安全 是
鎖代碼塊的好處,提高效率,過濾掉已經存在實例的對象
也不能鎖this Synchronized(this), 因為靜態方法在類加載時就產生,類對象還沒生成。
Synchronized(SingleObject.class) = static synchronized void getInstance(){}Public class SingleObject {Private volatile static SingleObject instance = new SingleObject();Private SingleObject() {}Private static SingleObject getInstance() {if(instance == null) {synchronized (SingleObject.class) {if(instance == null) {instance = new SingleObject(); } Return instance; } } } }5.????登記式、靜態內部類
Lazy初始化 是
線程安全 是
總結
以上是生活随笔為你收集整理的[设计模式笔记]3.单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。