JAVA設計模式-單例模式
本文講解GOF-23種設計模式其中的單例模式 。
單例模式說難吧,其實只有那麼幾句程式碼。
說簡單吧,其實也要深入理解才能瞭解它的原理,廢話少說,看程式碼
一、餓漢式寫法
/** * 作者: Created by AdminFun * 郵箱: [email protected] * 描述: 餓漢式單例 * 這種寫法是最簡單、也算是比較完美的寫法,但是這種寫法有一些缺點: * 1、instance的初始化是在類載入的時候完成的,所以不管你用不用都會初始化,可能造成資源浪費。 * 2、如果初始化instance需要依賴其他的資料,那麼這裡就不能保證在初始化之前準備好。 * 相比於餓漢式寫法,有一種更加優美的寫法,那就是懶漢式寫法 {@link CarHelper1} */ public class CarHelper { private static final CarHelper instance = new CarHelper(); private CarHelper() { } public static CarHelper getInstance() { return instance; } }
二、懶漢式寫法
/** * 作者: Created by AdminFun * 郵箱: [email protected] * 描述: 懶漢式單例 */ public class CarHelper1 { /** * volatile 關鍵字的作用是禁止指令重排,用volatile修飾之後, * 對instance的讀寫操作就有一個記憶體保障,保證在完成寫之前不會被呼叫讀。 * <p> * 想要了解上面一句話,則需要了解JVM中例項化執行過程: * 1、分配記憶體 * 2、初始化成員變數,形成例項 * 3、將物件指標指向該記憶體 * 在多執行緒操作的時候,以上3個步驟可能會被交叉執行,造成錯誤記憶體,volatile就是用來解決這個問題的。 * 不過在平常的一般開發中我們並沒有這麼嚴格的要求單例寫法,因為在APP開發中很少遇到多執行緒操作或者我們根本不在乎這個問題 */ private static volatile CarHelper1 instance; /** * 構造方法私有是保證不被外部呼叫 */ private CarHelper1() { // 可以根據需求初始化自己需要的內容 } /** * 使用雙重判斷 +執行緒鎖 * 雙重判斷:是為了提升效率,畢竟synchronized算是一個重量級執行緒鎖,如果能線上程鎖外面就攔截多執行緒,則會降低記憶體消耗 * 線 程 鎖:保證只能有1個執行緒執行鎖內操作 */ public static CarHelper1 getInstance() { if (instance == null) { synchronized (CarHelper1.class) { if (instance == null) { instance = new CarHelper1(); } } } return instance; } }