詳解java 單例模式及方法總結(jié)
java設(shè)計模式--單例模式
單例設(shè)計模式
Singleton是一種創(chuàng)建型模式,指某個類采用Singleton模式,則在這個類被創(chuàng)建后,只可能產(chǎn)生一個實例供外部訪問,并且提供一個全局的訪問點。
核心知識點如下:
(1) 將采用單例設(shè)計模式的類的構(gòu)造方法私有化(采用private修飾)。
(2) 在其內(nèi)部產(chǎn)生該類的實例化對象,并將其封裝成private static類型。
(3) 定義一個靜態(tài)方法返回該類的實例。
/** * 方法一 * 單例模式的實現(xiàn):餓漢式,線程安全 但效率比較低 */ public class SingletonTest { // 定義一個私有的構(gòu)造方法 private SingletonTest() { } // 將自身的實例對象設(shè)置為一個屬性,并加上Static和final修飾符 private static final SingletonTest instance = new SingletonTest(); // 靜態(tài)方法返回該類的實例 public static SingletonTest getInstancei() { return instance; } }
方法一就是傳說的中的餓漢模式
優(yōu)點是:寫起來比較簡單,而且不存在多線程同步問題,避免了synchronized所造成的性能問題;
缺點是:當類SingletonTest被加載的時候,會初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間,從這以后,這個static的instance對象便一直占著這段內(nèi)存(即便你還沒有用到這個實例),當類被卸載時,靜態(tài)變量被摧毀,并釋放所占有的內(nèi)存,因此在某些特定條件下會耗費內(nèi)存。
/** *方法二 * 單例模式的實現(xiàn):飽漢式,非線程安全 * */ public class SingletonTest { // 定義私有構(gòu)造方法(防止通過 new SingletonTest()去實例化) private SingletonTest() { } // 定義一個SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字) private static SingletonTest instance; // 定義一個靜態(tài)的方法(調(diào)用時再初始化SingletonTest,但是多線程訪問時,可能造成重復初始化問題) public static SingletonTest getInstance() { if (instance == null) instance = new SingletonTest(); return instance; } }
方法二就是傳說的中的飽漢模式
優(yōu)點是:寫起來比較簡單,當類SingletonTest被加載的時候,靜態(tài)變量static的instance未被創(chuàng)建并分配內(nèi)存空間,當getInstance方法第一次被調(diào)用時,初始化instance變量,并分配內(nèi)存,因此在某些特定條件下會節(jié)約了內(nèi)存;
缺點是:并發(fā)環(huán)境下很可能出現(xiàn)多個SingletonTest實例。
/** *方法三 * 單例模式的實現(xiàn):飽漢式,線程安全簡單實現(xiàn) * */ public class SingletonTest { // 定義私有構(gòu)造方法(防止通過 new SingletonTest()去實例化) private SingletonTest() { } // 定義一個SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字) private static SingletonTest instance; // 定義一個靜態(tài)的方法(調(diào)用時再初始化SingletonTest,使用synchronized 避免多線程訪問時,可能造成重的復初始化問題) public static synchronized SingletonTest getInstance() { if (instance == null) instance = new SingletonTest(); return instance; } }
方法三為方法二的簡單優(yōu)化
優(yōu)點是:使用synchronized關(guān)鍵字避免多線程訪問時,出現(xiàn)多個SingletonTest實例。
缺點是:同步方法頻繁調(diào)用時,效率略低。
/** * 方法四 * 單例模式最優(yōu)方案 * 線程安全 并且效率高 * */ public class SingletonTest { // 定義一個私有構(gòu)造方法 private SingletonTest() { } //定義一個靜態(tài)私有變量(不初始化,不使用final關(guān)鍵字,使用volatile保證了多線程訪問時instance變量的可見性,避免了instance初始化時其他變量屬性還沒賦值完時,被另外線程調(diào)用) private static volatile SingletonTest instance; //定義一個公有的靜態(tài)方法,返回該類型實例 public static SingletonTest getIstance() { // 對象實例化時與否判斷(不使用同步代碼塊,instance不等于null時,直接返回對象,提高運行效率) if (instance == null) { //同步代碼塊(對象未初始化時,使用同步代碼塊,保證多線程訪問時對象在第一次創(chuàng)建后,不再重復被創(chuàng)建) synchronized (SingletonTest.class) { //未初始化,則初始instance變量 if (instance == null) { instance = new SingletonTest(); } } } return instance; } }
方法四為單例模式的最佳實現(xiàn)。內(nèi)存占用地,效率高,線程安全,多線程操作原子性。
(事實上,可以通過Java反射機制來實例化private類型的構(gòu)造方法,此時基本上會使所有的Java單例實現(xiàn)失效。本帖不討論反射情況下問題,默認無反射,也是常見的面試已經(jīng)應(yīng)用場景)
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
maven?scope?provided和runtime的例子說明
這篇文章主要介紹了maven?scope?provided和runtime的例子說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12MyBatis使用注解開發(fā)和無主配置文件開發(fā)的情況
這篇文章主要介紹了MyBatis使用注解開發(fā)和無主配置文件開發(fā)的情況,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03MyBatis Plus插件機制與執(zhí)行流程原理分析詳解
這篇文章主要介紹了MyBatis Plus插件機制與執(zhí)行流程原理分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09SpringBoot2基于重復創(chuàng)建bean的問題及解決
這篇文章主要介紹了SpringBoot2基于重復創(chuàng)建bean的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Java Http請求傳json數(shù)據(jù)亂碼問題的解決
這篇文章主要介紹了Java Http請求傳json數(shù)據(jù)亂碼問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09解決mybatis三表連接查詢數(shù)據(jù)重復的問題
這篇文章主要介紹了解決mybatis三表連接查詢數(shù)據(jù)重復的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01