最佳单例模式
initialization on demand holder 模式分析
單例模式要求在應(yīng)用運行的過程中,只有一個類的實例存在。因此,要確保創(chuàng)建過程是線程安全的,同時要兼顧性能。目前了解到做得比較好的,就是這種initialization on demand holder模式(簡稱holder模式)。holder模式巧妙使用虛擬機的類加載和初始化機制來實現(xiàn)延遲加載和保證創(chuàng)建過程線程安全。
首先看下holder模式:
然后,分析運行 BestSingleton.getInstance()語句的過程:
1. ClassLoader加載BestSingleton類,并初始化,由于BestSingleton類不存在任何域,初始化看起來沒有做任何事。
2. 調(diào)用BestSingleton類的getInstance()方法,至此,LazyLolder類的調(diào)用第一次出現(xiàn)。因為調(diào)用的是一個靜態(tài)域,因此要執(zhí)行LazyLolder類的靜態(tài)初始化。
3. 靜態(tài)初始化LazyLolder類,也就是對INSTANCE 變量進行初始化,實例化一個BestSingleton類的實例,并賦值給INSTANCE 。
4. 繼續(xù)執(zhí)行g(shù)etInstance()方法的返回語句。
關(guān)鍵是在第三步,jvm對類的初始化過程是一個串行,單線程的過程,所以不會有并發(fā)的問題。
hoader模式失敗案例
這個單例模式還是有失敗的時候,不過個人覺得很好會遇到吧。在參考3里可以看到失敗例子。
jvm類加載和初始化過程簡要
jvm第一次用到一個類的時候,如果類還未加載,則找到該類的class文件并加載該類。每個類都對應(yīng)一個class文件,內(nèi)部類也是如此。
第一次使用可以分為:
- 創(chuàng)建一個類的實例,要對實例化。
- 使用用類的靜態(tài)域或方法,要進行靜態(tài)初始化。
根據(jù)不同的使用類型進行不同初始化。
靜態(tài)初始化:
靜態(tài)初始化不會調(diào)用類的構(gòu)造方法,構(gòu)造方法只有在類實例化的時候才會調(diào)用。
實例化
參考資料:
總結(jié)
- 上一篇: python不同数据的读入_python
- 下一篇: 网传清华北大等校招年薪可达27万元 比亚