把煩惱都拋給虛擬機——InstanceHolder單例

01

 

你知道的

 

有段時間沒有發文了,最近全量復工了,公司這邊也接了一個比較重要的項目。也感謝大家,在斷更的這段日子裏依然不離不棄。

 

畢竟,我的讀者智商超越了99%的人。

 

不過工作歸工作,學習的進程還是不能停的。

 

今天,就向大家介紹一款我最近遇到的神奇的單例寫法。

 

說起單例,相信大家一定都不陌生了,什麼懶漢式,餓漢式,雙重檢查。。。。。。單例的常規寫法相信大家一定都能信手拈來。

 

可是今天向大家介紹的這種,可能並不常見。

 

魯迅曾經說過:“Talk is cheap,show me the fucking code!”

 

 

 

 

02

 

單例的後浪——InstanceHolder


 

public class Singleton {
/**
* 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例
* 沒有綁定關係,而且只有被調用到纔會裝載,從而實現了延遲加載
*/
private static class SingletonHolder{
/**
* 靜態初始化器,由JVM來保證線程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化構造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}

下面我們就來分析一下,爲什麼它就能實現單例了呢。

 

首先,讓我們看Singleton類,同其他常規的單例一樣,他也是將構造函數進行了私有化,並且實現了getInstance函數,但是在getInstance的實現裏,他返回的是SingletonHolder.instance,也就是通過SingletonHolder的靜態變量來創建的Singleton實例。

 

熟悉Java虛擬機的朋友一定都知道,一個類的靜態方法區和靜態變量都是在什麼時候被執行和加載的?這個類被第一次加載進內存的時候嘛,所以說,當我們調用了getInstance方法的時候,就調用到了SingletonHolder類,而虛擬機發現,”WC,這個類還沒被加載,趕緊安排上”,他就開始把SingletonHolder加載進內存並開始加載其中的靜態方法區和靜態變量,這個時候,我們的instance變量也就被賦上了值。

 

而且這樣寫的好處在哪?不需要我們來管理線程間的同步問題了,因爲虛擬機在類進行加載的時候會幫助我們做好這件事,所以,這種寫法可以說是一種寫法極爲簡單而且還高效,安全的寫法。

 

現在,這種寫法已經在我所負責的項目中進行使用了,你也快來試試吧。

 

 


                                                                                點個贊再走唄

 

                                                               最豪橫的互聯網乾貨,掃一掃即刻擁有

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章