更新時間:2020-05-06 14:51:08 來源:動力節點 瀏覽2871次
JAVA設計模式
Java設計模式其實算是java在發展的過程中前人總結下來的一種經驗,針對于不同的應用場景,可以用不同的設計模式來解決問題,同時,在有的場景,可以有多種設計模式可以選擇,這就需要我們對設計模式了解得足夠透徹,然后才能去找到最適合的設計模式。
以前我也一直在看設計模式,只是一直沒有去系統的學習,然后轉化為博客筆記,加深自己對設計模式的理解。后面會把這些設計模式系統學習一遍寫成博客,當做是自己學習的一種記錄。
JAVA設計模式之單例模式
java的單例模式應該是最簡單最容易實現,同時也是面試特別容易遇到的一種設計模式了。顧名思義,單例模式就是我們的某個類在應用中需要以單個實例的方式存在,不管在哪里以及什么時候調用,都是拿的這個實例,而不是去重新初始化。
單例模式在開發中的應用也是很常見的,比如web應用的配置對象的讀取、數據庫連接池的設計、windows的任務管理器等等這些。
雖然單例模式簡單,實現所需要的代碼數量也不多,但是考慮到懶加載、線程安全等問題,其實也是很容易出問題的,通常面試的時候,如果考到單例模式也是拿這些問題來考量的。
同時單例模式也有多種實現方式。
餓漢式
懶漢式
這種單例模式既實現了懶加載,也滿足了線程安全,看似非常完美了,但是其實它并不高效,因為這種方式加鎖在方法上了,因為鎖粒度的問題,導致每次進入方法的只會有一個線程,其他線程都會被擋在方法外,等待前一個線程執行完這個方法。仔細想一下,其實是沒必要的,我們可以將鎖的粒度變得更細,因此也演變出了雙重鎖驗證的實現方式。
雙重鎖驗證
這種方式實現單例模式是最容易在面試中被提到的,這里有兩次判空操作,因此叫雙重鎖驗證,為什么這里需要doublecheck,當我們想不通的時候,其實可以試試反證法,這里如果第一次驗證不要的話,可以發現,就和懶漢式其實是一樣的了,那么這樣就會造成不高效,那為什么需要第二次的驗證呢,可以想想,如果取消第二次的驗證,可能會有多個線程進入if語句,然后單獨進入同步塊,這樣就會造成多個實例,因此兩次驗證缺一不可。
這里需要注意的是volitile這個關鍵字,為什么要在instance加這個關鍵字,這個關鍵字有兩個作用,一個是保證instance的內存可見性,也就是每次讀寫操作都保證是內存中的最新值,另一方面是禁止jvm的重排序優化,如果這里不加這個關鍵字,由于jvm的重排序優化,可能會導致instance還沒有初始化完成,其他線程就得到了這個instance的引用值,然后就順理成章的報錯。詳情可以去看周老先生的《深入java虛擬機》
內部靜態類
內部靜態類的方式來實現是我比較喜歡的方式了,因為這種方式滿足懶加載,沒有線程安全問題,同時也十分高效,光看代碼也容易讓人理解。
枚舉類
這種方式應該是實現單例模式最簡潔的方式了,調用直接用Singleton.INSTANCE就可以了。
以上就是動力節點java培訓機構的小編針對“Java單例設計模式之單例模式”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習