內(nèi)部類和單例
懶漢式和餓漢式都存在小小的缺陷,有沒(méi)有一種更好的方案,既能實(shí)現(xiàn)延遲加載,又能實(shí)現(xiàn)線程安全呢?解決方案是Lazy initialization holder calss模式,這個(gè)模式綜合了Java 的類級(jí)內(nèi)部類和多線程默認(rèn)同步鎖的知識(shí),很巧妙的同時(shí)實(shí)現(xiàn)了延遲加載和線程安全。
演示代碼如下:

當(dāng)getInstance第一次被調(diào)用時(shí),才第一次讀取ClassSingletonHolder.instance,導(dǎo)致ClassSingletonHolder得到初始化,而這個(gè)類初始化時(shí),會(huì)初始化靜態(tài)域instance,從而創(chuàng)建ClassSingleton對(duì)象,由于是靜態(tài)域,因此只會(huì)被虛擬機(jī)在裝載類的時(shí)候初始化一次,并由虛擬機(jī)保證它的線程安全。
單例和枚舉
單元素的枚舉類是實(shí)現(xiàn)單例的最佳方式。
Java的枚舉類本身也是功能齊全的類,有自己的屬性和方法,因此也可以作為一般的類使用。枚舉類的基本思想是通過(guò)共有的靜態(tài)final域?yàn)槊總€(gè)枚舉常量導(dǎo)出實(shí)例的類。
使用枚舉來(lái)實(shí)現(xiàn)單例非常簡(jiǎn)單,只需要編寫一個(gè)包含單個(gè)元素的枚舉類即可,演示代碼如下:

可以看到上面極其簡(jiǎn)單的代碼在枚舉中實(shí)現(xiàn)了單例,獲取實(shí)例的話,可以直接使用類名加屬性。
枚舉實(shí)現(xiàn)單例不僅更加簡(jiǎn)潔,而且無(wú)償提供序列化的機(jī)制,并有jvm從根本上提供保障,絕對(duì)防止多次實(shí)例化,是更簡(jiǎn)潔高效安全的實(shí)現(xiàn)單例的方式。
代碼:https://gitee.com/blueses/design-pattern