Java 單例模式詳解

目錄

1. 餓漢式(Eager Initialization)

2. 懶漢式(Lazy Initialization)

3. 懶漢式 + 同步鎖(線程安全)

4. 雙重檢查鎖(Double-Checked Locking)

5. 靜態內部類(推薦)

6. 枚舉(最佳實踐)

單例模式的序列化與反序列化問題

單例模式適用場景

總結


單例模式是 Java 中最簡單且最常用的設計模式之一,其核心思想是確保一個類只有一個實例,并提供全局訪問點。下面分別詳解 Java 中的單例模式:

1. 餓漢式(Eager Initialization)

特點:類加載時立即創建實例,線程安全。
缺點:不支持延遲加載,可能造成資源浪費。

public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有構造函數public static Singleton getInstance() {return INSTANCE;}
}

2. 懶漢式(Lazy Initialization)

特點:首次調用時創建實例,支持延遲加載。
缺點:多線程環境下不安全。

public class Singleton {private static Singleton INSTANCE;private Singleton() {}public static Singleton getInstance() {if (INSTANCE == null) { // 多線程可能同時進入此判斷INSTANCE = new Singleton();}return INSTANCE;}
}

3. 懶漢式 + 同步鎖(線程安全)

特點:通過synchronized保證線程安全。
缺點:每次調用都加鎖,性能開銷大。

public class Singleton {private static Singleton INSTANCE;private Singleton() {}public static synchronized Singleton getInstance() { // 方法級同步if (INSTANCE == null) {INSTANCE = new Singleton();}return INSTANCE;}
}

4. 雙重檢查鎖(Double-Checked Locking)

特點:線程安全且性能優化,僅首次創建時加鎖。
關鍵點:使用volatile關鍵字禁止指令重排序。

public class Singleton {private static volatile Singleton INSTANCE; // 防止指令重排序private Singleton() {}public static Singleton getInstance() {if (INSTANCE == null) { // 第一次檢查,不加鎖synchronized (Singleton.class) {if (INSTANCE == null) { // 第二次檢查,加鎖后INSTANCE = new Singleton();}}}return INSTANCE;}
}

5. 靜態內部類(推薦)

特點:線程安全、支持延遲加載,實現簡潔。
原理:JVM 保證靜態內部類的初始化線程安全。

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

6. 枚舉(最佳實踐)

特點:線程安全、自動支持序列化機制、防止反射攻擊。
推薦場景:需要絕對防止單例被破壞的場景。

public enum Singleton {INSTANCE;// 可以添加方法public void doSomething() {System.out.println("Singleton method called");}
}

單例模式的序列化與反序列化問題

如果單例類實現了Serializable接口,需添加readResolve()方法防止反序列化時創建新實例:

private Object readResolve() {return INSTANCE;
}

單例模式適用場景

  • 資源管理器(如數據庫連接池、線程池)。
  • 配置文件管理。
  • 日志記錄器。
  • GUI 中的窗口管理器。

總結

推薦使用靜態內部類枚舉實現單例模式:

  • 靜態內部類:簡潔、安全、支持延遲加載。
  • 枚舉:防反射、防序列化攻擊,寫法優雅。

避免使用普通懶漢式,在多線程環境下需使用雙重檢查鎖或更優方案

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從 AMQP 到 RabbitMQ:核心組件設計與工作原理(一)

一、引言 ** 在當今分布式系統盛行的時代,消息隊列作為一種關鍵的中間件技術,承擔著系統間異步通信、解耦和削峰填谷的重要職責。AMQP(Advanced Message Queuing Protocol)作為一種高級消息隊列協議,為消息隊列的實現…

概率單純形(Probability Simplex)

目錄 定義性質在統計學中的應用在機器學習中的應用在信息論中的應用在優化問題中的應用在其他領域的應用 定義 定義:在數學中,概率單純形(Probability Simplex)是指在 n n n維空間中,所有分量非負且分量之和為1的向量…

項目練習:Vue2中el-button上的@click事件失效

文章目錄 一、問題描述二、解決 一、問題描述 button按鈕上綁定了一個click事件 對應的方法寫在methods中 但是&#xff0c;測試點擊時&#xff0c;無法觸發函數 二、解決 1、問題代碼 <el-buttonclick"changeConfirm(Y)"type"success"plainicon&qu…

十六、【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置

【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置 前言準備工作第一步:更新前端 `TestCase` 類型定義第二步:改造 `TestCaseEditView.vue` 表單第三步:修改后端代碼中的TestCase模型和序列化器第四步:測試強化后的用例編輯器總結前言 在之前的后端文章…

HTTP連接管理——短連接,長連接,HTTP 流水線

連接管理是一個 HTTP 的關鍵話題&#xff1a;打開和保持連接在很大程度上影響著網站和 Web 應用程序的性能。在 HTTP/1.x 里有多種模型&#xff1a;短連接、_長連接_和 HTTP 流水線。 下面分別來詳細解釋 短連接 HTTP 協議最初&#xff08;0.9/1.0&#xff09;是個非常簡單的…

MySQL范式和反范式

范式 是用一組規則定義的數據庫設計標準&#xff0c;旨在確保數據庫結構合理&#xff0c;避免數據冗余和異常。 目的 消除數據的重復&#xff0c;提高存儲效率防止數據異常&#xff08;插入、刪除、更新異常&#xff09;提高數據的完整性和一致性 第一范式 定義 所有列&am…

編程技能:格式化打印04,sprintf

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;格式化打印03&#xff0c;printf 回到目錄…

JavaScript性能優化實戰:深入探討JavaScript性能瓶頸與優化技巧

引言:為什么JavaScript性能至關重要 在現代Web開發中,JavaScript已成為構建交互式應用程序的核心技術。隨著單頁應用(SPA)和復雜前端架構的普及,JavaScript代碼的性能直接影響用戶體驗、轉化率甚至搜索引擎排名。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而性能…

Java數據結構——八大排序

排序 插?排序希爾排序直接選擇排序堆排序冒泡排序快速排序歸并排序計數排序 排序的概念 排序&#xff1a;就是將一串東西&#xff0c;按照要求進行排序&#xff0c;按照遞增或遞減排序起來 穩定性&#xff1a;就是比如排序中有兩個相同的數&#xff0c;如果排序后&#xff0c…

WPF響應式UI的基礎:INotifyPropertyChanged

INotifyPropertyChanged 1 實現基礎接口2 CallerMemberName優化3 數據更新觸發策略4 高級應用技巧4.1 表達式樹優化4.2 性能優化模式4.3 跨平臺兼容實現 5 常見錯誤排查 在WPF的MVVM架構中&#xff0c; INotifyPropertyChanged是實現數據驅動界面的核心機制。本章將深入解析屬…

低空城市場景下的多無人機任務規劃與動態協調!CoordField:無人機任務分配的智能協調場

作者&#xff1a;Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1單位&#xff1a; 1 ^{1} 1澳門科技大學創新工程學院工程科學系&#xff0…

解決Java項目NoProviderFoundException報錯

前言 在Java開發中&#xff0c;jakarta.validation.NoProviderFoundException 是一個令人困惑的運行時錯誤&#xff0c;常因校驗框架依賴缺失或版本沖突導致。 問題復現&#xff1a;用戶注冊校驗失敗 業務場景 開發一個用戶注冊功能&#xff0c;要求&#xff1a; 校驗郵箱…

重構跨境收益互換價值鏈:新一代TRS平臺的破局之道

當香港券商面對內地洶涌的結構化產品需求&#xff0c;一套智能化的TRS系統正成為打開萬億市場的金鑰匙 在跨境金融的暗流涌動中&#xff0c;一家中資背景的香港券商正面臨甜蜜的煩惱&#xff1a;內地高凈值客戶對港股、美股的杠桿交易需求激增&#xff0c;但傳統TRS業務深陷操作…

實驗設計如何拯救我的 CEI VSR 28G 設計

為了確定總體設計裕量&#xff0c;CEI 28G VSR/100 Gb 以太網設計需要分析 500 萬種通道變化、收發器工藝和均衡設置的組合。蠻力模擬需要 278 天&#xff0c;這顯然超出了可用的時間表。 相反&#xff0c;我們使用實驗設計 &#xff08;DOE&#xff09; 和響應面建模 &#x…

【仿生機器人】刀劍神域——愛麗絲蘇醒計劃,需求文檔

仿生機器人"愛麗絲"系統架構設計需求文檔 一、硬件基礎 已完成頭部和頸部硬件搭建 25個舵機驅動表情系統 頸部旋轉功能 眼部攝像頭&#xff08;視覺輸入&#xff09; 麥克風陣列&#xff08;聽覺輸入&#xff09; 頸部發聲裝置&#xff08;語音輸出&#xff09…

【Day44】

DAY 44 預訓練模型 知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 作業&#xff1a; 嘗試在cifar10對比如下其他的預訓練模型&#xff0c;觀察差異&#xff0c;盡可能和他人選擇的不同嘗試通…

python打卡訓練營打卡記錄day44

知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 作業&#xff1a; 嘗試在cifar10對比如下其他的預訓練模型&#xff0c;觀察差異&#xff0c;盡可能和他人選擇的不同嘗試通過ctrl進入resnet的…

Vue跨層級通信

下面,我們來系統的梳理關于 Vue跨層級通信 的基本知識點: 一、跨層級通信核心概念 1.1 什么是跨層級通信 跨層級通信是指在組件樹中,祖先組件與后代組件(非直接父子關系)之間的數據傳遞和交互方式。這種通信模式避免了通過中間組件層層傳遞 props 的繁瑣過程。 1.2 適用…

webPack基本使用步驟

webPack基本使用步驟 關于webPackwebPack配置的幾個概念entry&#xff08;入口&#xff09;output&#xff08;輸出&#xff09;loader&#xff08;輸出&#xff09;plugin&#xff08;插件&#xff09;mode&#xff08;模式&#xff09; 基本使用過程示例1.創建測試目錄和代碼…

龍虎榜——20250604

上證指數縮量收陽線&#xff0c;量能依然在5天線上&#xff0c;股價也在5天線上。 深證指數放量收陽線&#xff0c;量能站上5天均線&#xff0c;但仍受中期60天均線壓制。 2025年6月4日龍虎榜行業方向分析 1. 黃金 代表標的&#xff1a;曼卡龍、菜百股份。 驅動邏輯&#…