單例模式

單例,就是一個對象在內存中加載初始化和實例化都只有一個,以往我們創建對象都是很隨意就寫成 XXX xx = new XXX(); 這樣每次new一個,就會在堆中新創建一個該XXX對象,這個方法也是語法糖之一,通過默認的構造方法創建對象。
如果一個大對象頻繁創建銷燬回收,會造成資源的浪費,一定程度上加重GC的負擔,不利於內存管理。
要實現單例模式,我們只需要簡單三步驟:

(1)默認無參構造方法私有化,這樣外界就不能再通過new關鍵字來創建該對象了。

在這裏插入圖片描述

(2)把對象的創建設置爲靜態static的,這樣在加載時初始化這個類的時候就會自動分配內存空間。方便外部調用該類的靜態類方法。

在這裏插入圖片描述

(3)統一通過getInstance()方法返回該對象在內存中的唯一實例。

這裏是因爲static修飾的引用類型在類加載的時候只會在準備階段分配空間,然後在初始化階段實例化一次。
在這裏插入圖片描述

懶漢式

顧名思義就是非常懶,懶得在JVM加載初始化的階段就去實例化對象並且附值給唯一實例。簡單來說就是聲明瞭個引用類型在那裏,就是懶得去new 。直到別人調用了getInstance()方法,被逼的沒辦法了,才懶洋洋去new 實例化一個自身對象。
懶漢式是非線程安全的,可能會發生多個線程同時new,導致了單例模式失效。
解決方法就是簡單粗暴在getInstance()方法加同步鎖synchronized。但是加了同步鎖,大家都懂得,效率很低。
在這裏插入圖片描述

餓漢式

餓漢式就是非常積極,彷彿就快要餓死那麼衝動積極。聲明瞭引用類型隨即就附值。

餓漢式是線程安全的,不管三七二十一先把類實例化再說,從此多線程再多也只能一個個拿到早已經準備好的實例化對象返回。
缺點也是很明顯的:假如有的類從頭到尾都沒有用上,但是它也在內存中創建了實例,就造成了垃圾對象佔用內存問題。
在這裏插入圖片描述

單例模式先總結到這裏,鞠躬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章