<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【設計模式】單例模式

      單例模式深度解析:從基礎到實現原理

      一、單例模式核心概念

      單例模式是一種創建型設計模式,確保一個類只有一個實例,并提供該實例的全局訪問點。這種模式的核心價值在于:

      • ? 避免資源沖突(如配置文件、數據庫連接池)
      • ? 節省系統資源開銷
      • ? 統一管理共享資源
      • ? 控制全局訪問點

      典型應用場景

      1. 配置管理器(全局共享配置)
      2. 數據庫連接池(避免重復創建連接)
      3. 日志記錄器(統一管理日志寫入)
      4. 設備驅動程序(如打印機控制)
      5. 緩存系統(全局共享緩存數據)

      二、單例模式實現方式大全

      1. 餓漢式(線程安全)

      public class EagerSingleton {
          private static final EagerSingleton INSTANCE = new EagerSingleton();
          
          private EagerSingleton() {
              // 防止反射攻擊
              if (INSTANCE != null) {
                  throw new IllegalStateException("Singleton already initialized");
              }
          }
          
          public static EagerSingleton getInstance() {
              return INSTANCE;
          }
      }
      
      • ? 優點:實現簡單,線程安全
      • ?? 缺點:類加載時即初始化,可能造成資源浪費

      2. 懶漢式(非線程安全)

      public class LazySingleton {
          private static LazySingleton instance;
          
          private LazySingleton() {}
          
          public static LazySingleton getInstance() {
              if (instance == null) {
                  instance = new LazySingleton();
              }
              return instance;
          }
      }
      
      • ? 優點:延遲初始化
      • ?? 缺點:多線程環境下不安全

      3. 同步方法懶漢式(線程安全)

      public class SynchronizedSingleton {
          private static SynchronizedSingleton instance;
          
          private SynchronizedSingleton() {}
          
          public static synchronized SynchronizedSingleton getInstance() {
              if (instance == null) {
                  instance = new SynchronizedSingleton();
              }
              return instance;
          }
      }
      
      • ? 優點:線程安全
      • ?? 缺點:每次獲取實例都加鎖,性能差

      4. 雙重檢查鎖(DCL)

      public class DoubleCheckedLockingSingleton {
          private static volatile DoubleCheckedLockingSingleton instance;
          
          private DoubleCheckedLockingSingleton() {}
          
          public static DoubleCheckedLockingSingleton getInstance() {
              if (instance == null) {
                  synchronized (DoubleCheckedLockingSingleton.class) {
                      if (instance == null) {
                          instance = new DoubleCheckedLockingSingleton();
                      }
                  }
              }
              return instance;
          }
      }
      
      • ? 優點:線程安全且高性能
      • ?? 注意:必須使用volatile防止指令重排序

      5. 靜態內部類(推薦)

      public class StaticInnerClassSingleton {
          private StaticInnerClassSingleton() {}
          
          private static class Holder {
              static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
          }
          
          public static StaticInnerClassSingleton getInstance() {
              return Holder.INSTANCE;
          }
          
          // 防止反序列化破壞單例
          protected Object readResolve() {
              return getInstance();
          }
      }
      

      6. 枚舉單例(最佳實踐)

      public enum EnumSingleton {
          INSTANCE;
          
          // 添加業務方法
          public void businessMethod() {
              System.out.println("Business logic executed");
          }
      }
      

      三、靜態內部類原理深度剖析

      靜態內部類實現之所以無需同步開銷,關鍵在于利用了Java類加載機制的天然線程安全性:

      ?? 核心機制:JVM的類初始化鎖

      Java虛擬機規范明確規定:

      每個類都有唯一的初始化鎖。類初始化由JVM隱式加鎖,確保多線程環境下只執行一次初始化。

      實現原理

      public class Singleton {
          private Singleton() {}
          
          private static class Holder {
              static final Singleton INSTANCE = new Singleton();
          }
          
          public static Singleton getInstance() {
              return Holder.INSTANCE; // 觸發類加載
          }
      }
      

      ? 無同步開銷的底層原理

      1. 延遲加載時機
        Holder類在首次調用getInstance()時才會被加載

      2. 類初始化鎖機制

        步驟 多線程場景 JVM行為
        線程A首次調用getInstance() 觸發Holder類加載 JVM獲取類初始化鎖
        線程B同時調用getInstance() 檢測到Holder正在初始化 線程B阻塞
        線程A完成初始化 釋放鎖
        線程B被喚醒 發現類已初始化 直接返回實例
      3. 字節碼驗證
        getInstance()方法的字節碼中沒有任何monitorenter/monitorexit指令(無同步鎖操作)

      ?? 同步機制對比

      實現方式 同步機制 性能影響
      同步方法懶漢式 方法級synchronized 每次調用都加鎖
      雙重檢查鎖 代碼塊synchronized 首次創建后仍需讀volatile
      靜態內部類 JVM類初始化鎖 僅首次加載時隱式同步

      ??? JVM如何保證線程安全

      根據Java語言規范(JLS §12.4.2):

      類初始化階段執行原子操作:

      1. 獲取類初始化鎖
      2. 如果類正在初始化,則阻塞當前線程
      3. 如果類未初始化,執行靜態初始化
      4. 釋放鎖并通知等待線程

      四、單例模式防護措施

      1. 反射攻擊防護

      private Singleton() {
          if (instance != null) {
              throw new IllegalStateException("Singleton already initialized");
          }
      }
      

      2. 反序列化防護

      // 在類中添加readResolve方法
      protected Object readResolve() {
          return getInstance();
      }
      

      唯一完全防護方案:使用枚舉單例(天然防反射和反序列化攻擊)

      五、實現方式對比與最佳實踐

      實現方式 線程安全 延遲加載 防反射 防序列化 性能
      餓漢式 ? ? ? ? ????
      懶漢式 ? ? ? ? ????
      同步方法 ? ? ? ? ??
      雙重檢查鎖 ? ? ? ? ???
      靜態內部類 ? ? ? ? ????
      枚舉 ? ? ? ? ????

      最佳實踐建議

      1. 優先選擇枚舉實現 - 簡潔安全,滿足大多數場景
      2. 需要延遲加載時選擇靜態內部類 - 平衡性能和安全性
      3. 避免使用雙重檢查鎖 - 除非明確理解內存模型細節
      4. 謹慎使用單例 - 過度使用會導致代碼耦合度高

      六、總結

      單例模式通過控制實例化過程,為系統提供了統一的訪問入口,是管理共享資源的利器。關鍵要點:

      1. 靜態內部類實現利用JVM類加載機制實現無鎖線程安全
      2. 枚舉實現提供最全面的防護(反射+序列化)
      3. 所有實現都需考慮反射和序列化的防護
      4. 根據實際需求在安全性和性能間取得平衡

      ?? 設計警示:單例模式雖好,但不要濫用。在需要真正全局唯一實例時才使用,否則會增加系統耦合度和測試難度。

      graph TD A[需要單例嗎?] --> B{需要延遲加載?} B -->|是| C{需要防御反射/序列化?} B -->|否| D[使用枚舉實現] C -->|是| D C -->|否| E[使用靜態內部類] D --> F[實現完成] E --> F

      通過深入理解各種實現方式的原理和適用場景,開發者可以做出更明智的設計決策,構建出既安全又高效的系統架構。

      posted @ 2025-06-26 15:36  佛祖讓我來巡山  閱讀(376)  評論(0)    收藏  舉報

      佛祖讓我來巡山博客站 - 創建于 2018-08-15

      開發工程師個人站,內容主要是網站開發方面的技術文章,大部分來自學習或工作,部分來源于網絡,希望對大家有所幫助。

      Bootstrap中文網

      主站蜘蛛池模板: 欧美黑人又粗又大又爽免费| 97se亚洲国产综合自在线观看| 日韩区二区三区中文字幕| 女人与牲口性恔配视频免费| 久久精品国产99久久6| 波多野结衣美乳人妻hd电影欧美| 久久精品国产亚洲av熟女| 97久久综合亚洲色hezyo| 熟女在线视频一区二区三区| 精品少妇av蜜臀av| 久久亚洲精品无码播放| 97精品国产91久久久久久久| 亚洲高清国产拍精品5G| 国产亚洲精品岁国产精品| 成人做爰www网站视频| 九九热在线视频免费播放| AV秘 无码一区二| 国产日韩精品视频无码| 亚洲电影在线观看| 国产91成人亚洲综合在线| 精品亚洲国产成人av| 国产午夜精品福利视频| 97一区二区国产好的精华液| 欧美特级午夜一区二区三区| 日韩中文字幕免费在线观看| 曰批免费视频播放免费| 一区二区三区四区五区自拍| 美女自卫慰黄网站| 国产日韩av二区三区| 国产毛片精品av一区二区| 日韩一区二区三区三级| 狠狠色综合久久狠狠色综合| 无遮挡又黄又刺激的视频| 亚洲一精品一区二区三区| 东方四虎在线观看av| 国产成人精品午夜2022 | 亚洲中文字幕无码日韩精品| 中文字幕在线日韩一区| 免费无码va一区二区三区| 国内极度色诱视频网站| 国产av一区二区三区无码野战|