Java單例設(shè)計模式之單例模式

Java單例設(shè)計模式之單例模式

長沙牛耳教育      2022-04-28 07:35:01     12

Java單例設(shè)計模式之單例模式,JAVA設(shè)計模式Java設(shè)計模式其實算是java在發(fā)展的過程中前人總結(jié)下來的一種經(jīng)驗,針對于不同的應用場景,可以用不同的設(shè)計模式來解

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細介紹

    JAVA設(shè)計模式

    Java設(shè)計模式其實算是java在發(fā)展的過程中前人總結(jié)下來的一種經(jīng)驗,針對于不同的應用場景,可以用不同的設(shè)計模式來解決問題,同時,在有的場景,可以有多種設(shè)計模式可以選擇,這就需要我們對設(shè)計模式了解得足夠透徹,然后才能去找到最適合的設(shè)計模式。

    以前我也一直在看設(shè)計模式,只是一直沒有去系統(tǒng)的學習,然后轉(zhuǎn)化為博客筆記,加深自己對設(shè)計模式的理解。后面會把這些設(shè)計模式系統(tǒng)學習一遍寫成博客,當做是自己學習的一種記錄。

    JAVA設(shè)計模式之單例模式

    java的單例模式應該是最簡單最容易實現(xiàn),同時也是面試特別容易遇到的一種設(shè)計模式了。顧名思義,單例模式就是我們的某個類在應用中需要以單個實例的方式存在,不管在哪里以及什么時候調(diào)用,都是拿的這個實例,而不是去重新初始化。

    單例模式在開發(fā)中的應用也是很常見的,比如web應用的配置對象的讀取、數(shù)據(jù)庫連接池的設(shè)計、windows的任務(wù)管理器等等這些。

    雖然單例模式簡單,實現(xiàn)所需要的代碼數(shù)量也不多,但是考慮到懶加載、線程安全等問題,其實也是很容易出問題的,通常面試的時候,如果考到單例模式也是拿這些問題來考量的。

    同時單例模式也有多種實現(xiàn)方式。

    餓漢式

    懶漢式

    這種單例模式既實現(xiàn)了懶加載,也滿足了線程安全,看似非常完美了,但是其實它并不高效,因為這種方式加鎖在方法上了,因為鎖粒度的問題,導致每次進入方法的只會有一個線程,其他線程都會被擋在方法外,等待前一個線程執(zhí)行完這個方法。仔細想一下,其實是沒必要的,我們可以將鎖的粒度變得更細,因此也演變出了雙重鎖驗證的實現(xiàn)方式。

    雙重鎖驗證

    這種方式實現(xiàn)單例模式是最容易在面試中被提到的,這里有兩次判空操作,因此叫雙重鎖驗證,為什么這里需要doublecheck,當我們想不通的時候,其實可以試試反證法,這里如果第一次驗證不要的話,可以發(fā)現(xiàn),就和懶漢式其實是一樣的了,那么這樣就會造成不高效,那為什么需要第二次的驗證呢,可以想想,如果取消第二次的驗證,可能會有多個線程進入if語句,然后單獨進入同步塊,這樣就會造成多個實例,因此兩次驗證缺一不可。

    這里需要注意的是volitile這個關(guān)鍵字,為什么要在instance加這個關(guān)鍵字,這個關(guān)鍵字有兩個作用,一個是保證instance的內(nèi)存可見性,也就是每次讀寫操作都保證是內(nèi)存中的最新值,另一方面是禁止jvm的重排序優(yōu)化,如果這里不加這個關(guān)鍵字,由于jvm的重排序優(yōu)化,可能會導致instance還沒有初始化完成,其他線程就得到了這個instance的引用值,然后就順理成章的報錯。詳情可以去看周老先生的《深入java虛擬機》

    內(nèi)部靜態(tài)類

    內(nèi)部靜態(tài)類的方式來實現(xiàn)是我比較喜歡的方式了,因為這種方式滿足懶加載,沒有線程安全問題,同時也十分高效,光看代碼也容易讓人理解。

    枚舉類

    這種方式應該是實現(xiàn)單例模式最簡潔的方式了,調(diào)用直接用Singleton.INSTANCE就可以了。

 以上就是長沙牛耳教育java培訓機構(gòu)的小編針對“Java單例設(shè)計模式之單例模式”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

培訓啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹慎!任何要求預付定金、匯款等方式均存在風險,謹防上當。