單例模式是編程開發(fā)二十三種設(shè)計模式中最基礎(chǔ)的一種設(shè)計模式,也是學(xué)習(xí)設(shè)計模式的入門知識。何謂單例模式,顧名思義只允許有一個實例。用編程的行話說,在程序運行的過程中,某一個類只能有一個對象存活在內(nèi)存中,其它程序不能隨意的new出來一個該類的對象。單例模式正是實現(xiàn)了這個需求,實現(xiàn)思路是該類在自己內(nèi)部創(chuàng)建一個對象,其它程序無法創(chuàng)建該類的對象。該類創(chuàng)建的對象向整個系統(tǒng)提供,其它程序可以獲取到這個對象并且使用。單例模式的實現(xiàn)一般有兩種方案:懶漢模式和餓漢模式。

懶漢模式

該類向外提供一個可以獲取該類對象的靜態(tài)方法,其它程序調(diào)用這個方法的時候,系統(tǒng)會判斷內(nèi)存中是否存在該類的對象,如果存在則返回該類的對象,如果不存在則創(chuàng)建一個新的該類對象。通俗的講,就是一開始并不創(chuàng)建對象,當(dāng)其它程序需要使用該對象的時候再創(chuàng)建。

懶漢模式的代碼實現(xiàn)如下:

Java懶漢和餓漢單例模式如何實現(xiàn)?

餓漢模式

餓漢模式是在程序啟動或者該類被系統(tǒng)加載的時候,就會創(chuàng)建一個該類的對象,別的程序如果需要使用該類的對象,直接來拿就好了。簡單的來說,餓漢模式是一勞永逸的。餓漢模式的代碼實現(xiàn)如下:

Java懶漢和餓漢單例模式如何實現(xiàn)?

餓漢模式和懶漢模式的區(qū)別

  1. 餓漢模式是空間換時間,一開始創(chuàng)建的對象可能其它程序用不到,這樣就會一直占用著內(nèi)存。懶漢模式是時間換空間,懶漢模式在需要的時候才去創(chuàng)建,有點“臨陣磨槍”的意思,會造成程序運行時間較長(其實差別是毫秒級的,但是做開發(fā)一定要嚴(yán)謹(jǐn))。

  2. 懶漢模式線程不安全,當(dāng)多線程調(diào)用的時候,需要加上同步鎖,這樣會大大影響程序的運行效率。餓漢模式是線程安全的,一勞永逸,程序運行效率要比懶漢模式高。