建立型模式:物件例項化的模式,建立型模式用於解耦物件的例項化過程。
以下參考這篇文章:
單例模式是指在記憶體中只會建立且僅建立一次物件的設計模式。在程式中多次使用同乙個物件且作用相同時,為了防止頻繁地建立物件使得記憶體飆公升,單例模式可以讓程式僅在記憶體中建立乙個物件,讓所有需要呼叫的地方都共享這一單例物件。
其實比較好理解的
餓漢式在類載入時已經建立好該物件,在程式呼叫時直接返回該單例物件即可。我們目前可以簡單認為在程式啟動時,這個單例物件就已經建立好了。
public構造方法私有,這樣就不能在外部new出物件,只能使用getinstance獲取物件。class
singleton
public
singleton getinstance()
}
優缺點:
public最基礎的寫法,類載入的時候沒有例項化,使用時才newclass
singleton
public
singleton getinstance()
return
singleton;}}
但這種寫法會出現併發問題
如果兩個執行緒同時判斷singleton為空,那麼它們都會去例項化乙個singleton物件,這就變成雙例了。所以,我們要解決的是執行緒安全問題。加上同步方法或者同步**塊
public但這兩種方式都不好,我們要鎖住的是 建立物件這一過程static
synchronized
singleton getinstance()
return
singleton;}//
或者public
static
singleton getinstance()
}return
singleton;
}
獲取物件這個過程沒必要加鎖
public這種寫法相對較好:static
singleton getinstance() }}
return
singleton;
}
建立乙個物件,在jvm中會經過三步:
(1)為singleton分配記憶體空間
(2)初始化singleton物件
(3)將singleton指向分配好的記憶體空間
指令重排序是指:jvm在保證最終結果正確的情況下,可以不按照程式編碼的順序執行語句,盡可能提高程式的效能
在這三步中,第2、3步有可能會發生指令重排現象,建立物件的順序變為1-3-2,會導致多個執行緒獲取物件時,有可能執行緒a建立物件的過程中,執行了1、3步驟,執行緒b判斷singleton已經不為空,獲取到未初始化的singleton物件,就會報npe異常。使用volatile關鍵字可以防止指令重排序。
最終**,把物件用volatile修飾
建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。
設計模式 建立型 單例模式
單例模式在整個軟體開發中還是比較常用的,頻繁使用且過程穩定的方法 全域性變數都可以使用該模式,也可以叫做公共類。單例模式需要遵循要麼出現一次,要麼不出現的規則。單例模式不提供外部例項化功能,在內部自已例項化以保證其唯一例項。具體如下 class common public static common...
設計模式 建立型 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式劃分 class singleton 獲取本類例項的唯一全域性訪問點 public static singleton getinstance return instance 物件屬於引用資料型別,和基本資料...
設計模式 建立型 單例模式
英文singleton,又稱單件模式。描述 確保類只有乙個例項,並且提供了乙個全域性訪問點。在應用的某些場景,我們只需要類的乙個例項就夠了,並且我們需要在應用的多個地方 客戶 方便的獲取該例項物件。比如應用中的乙個浮動工具欄,或者是乙個資訊收集器 專門收集應用中的操作資訊 等等。優點 方便的控制僅唯...