日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最佳单例模式

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最佳单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

initialization on demand holder 模式分析

單例模式要求在應用運行的過程中,只有一個類的實例存在。因此,要確保創建過程是線程安全的,同時要兼顧性能。目前了解到做得比較好的,就是這種initialization on demand holder模式(簡稱holder模式)。holder模式巧妙使用虛擬機的類加載和初始化機制來實現延遲加載和保證創建過程線程安全。
首先看下holder模式:

public class BestSingleton {//構造方法一定要設為privateprivate BestSingleton(){}private static class LazyLolder{private static final BestSingleton INSTANCE = new BestSingleton();}public static BestSingleton getInstance(){return LazyLolder.INSTANCE;} }

然后,分析運行 BestSingleton.getInstance()語句的過程:
1. ClassLoader加載BestSingleton類,并初始化,由于BestSingleton類不存在任何域,初始化看起來沒有做任何事。
2. 調用BestSingleton類的getInstance()方法,至此,LazyLolder類的調用第一次出現。因為調用的是一個靜態域,因此要執行LazyLolder類的靜態初始化。
3. 靜態初始化LazyLolder類,也就是對INSTANCE 變量進行初始化,實例化一個BestSingleton類的實例,并賦值給INSTANCE
4. 繼續執行getInstance()方法的返回語句。
關鍵是在第三步,jvm對類的初始化過程是一個串行,單線程的過程,所以不會有并發的問題。

hoader模式失敗案例

這個單例模式還是有失敗的時候,不過個人覺得很好會遇到吧。在參考3里可以看到失敗例子。

jvm類加載和初始化過程簡要

jvm第一次用到一個類的時候,如果類還未加載,則找到該類的class文件并加載該類。每個類都對應一個class文件,內部類也是如此。
第一次使用可以分為:

  • 創建一個類的實例,要對實例化
  • 使用用類的靜態域或方法,要進行靜態初始化

根據不同的使用類型進行不同初始化。

靜態初始化:

  • 對類變量(靜態變量)進行初始化
  • 執行靜態初始化語句,也就是static語句塊中包含的語句。
  • 靜態初始化不會調用類的構造方法,構造方法只有在類實例化的時候才會調用。

    實例化

  • 進行靜態初始化
  • 對實例變量進行初始化
  • 執行初始化語句塊,也就是用{}括起來的語句塊
  • 執行構造方法

  • 參考資料:

  • Java單例模式的各種寫法(Initialization on Demand Holder模式)
  • 線程安全的單例模式
  • Initialization-on-demand holder idiom
  • 總結

    以上是生活随笔為你收集整理的最佳单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。