Java 基礎-30-單例設計模式:懶漢式與餓漢式

在軟件開發中,單例設計模式(Singleton Design Pattern)是一種常用的設計模式,它確保一個類只有一個實例,并提供一個全局訪問點。這種模式通常用于管理共享資源(如數據庫連接池、線程池等)或需要全局唯一實例的場景。

本文將詳細介紹兩種常見的單例實現方式:懶漢式餓漢式,并分析它們的優缺點及適用場景。


1. 單例模式的核心要素

要實現單例模式,需要滿足以下三個條件:

  1. 私有化構造方法:防止外部通過new關鍵字創建對象。
  2. 提供靜態方法獲取唯一實例:通過一個公共的靜態方法返回唯一的實例。
  3. 保持單一實例:確保類中只有一個實例存在。

2. 餓漢式(Eager Initialization)

餓漢式是指在類加載時就立即創建實例。這種方式的特點是簡單直接,但可能會造成資源浪費(如果實例從未被使用過)。

實現代碼

public class SingletonEager {// 1. 私有化構造方法private SingletonEager() {System.out.println("SingletonEager instance created");}// 2. 在類加載時創建唯一的實例private static final SingletonEager instance = new SingletonEager();// 3. 提供公共的靜態方法獲取實例public static SingletonEager getInstance() {return instance;}
}

特點

  • 優點
    • 簡單易懂,實現方便。
    • 線程安全(因為實例在類加載時就已經創建,不存在多線程競爭問題)。
  • 缺點
    • 如果實例從未被使用過,會浪費內存資源。
    • 不適合需要延遲加載的場景。

3. 懶漢式(Lazy Initialization)

懶漢式是指在第一次調用getInstance()方法時才創建實例。這種方式可以避免資源浪費,但需要注意線程安全問題。

實現代碼(非線程安全版本)

public class SingletonLazy {// 1. 私有化構造方法private SingletonLazy() {System.out.println("SingletonLazy instance created");}// 2. 定義靜態變量,但不立即初始化private static SingletonLazy instance;// 3. 提供公共的靜態方法獲取實例public static SingletonLazy getInstance() {if (instance == null) { // 第一次檢查instance = new SingletonLazy(); // 創建實例}return instance;}
}

特點

  • 優點
    • 延遲加載,節省資源。
  • 缺點
    • 存在線程安全問題(多線程環境下可能創建多個實例)。
線程安全改進版(雙重檢查鎖定)

為了解決線程安全問題,可以使用雙重檢查鎖定(Double-Checked Locking)機制:

public class SingletonLazySafe {// 1. 私有化構造方法private SingletonLazySafe() {System.out.println("SingletonLazySafe instance created");}// 2. 使用volatile關鍵字保證可見性和禁止指令重排private static volatile SingletonLazySafe instance;// 3. 雙重檢查鎖定public static SingletonLazySafe getInstance() {if (instance == null) { // 第一次檢查synchronized (SingletonLazySafe.class) {if (instance == null) { // 第二次檢查instance = new SingletonLazySafe();}}}return instance;}
}

特點

  • 優點
    • 延遲加載,節省資源。
    • 線程安全。
  • 缺點
    • 實現復雜度較高。

4. 對比:懶漢式 vs 餓漢式

特性餓漢式懶漢式
實例創建時機類加載時第一次調用getInstance()
資源占用可能浪費資源延遲加載,節省資源
線程安全性天然線程安全需額外處理(如雙重檢查鎖定)
實現復雜度簡單較復雜
適用場景實例一定會被使用且對性能要求高實例可能不會被使用或需延遲加載

5. 其他實現方式(擴展)

除了懶漢式和餓漢式,還有其他常見的單例實現方式,例如:

枚舉單例

public enum SingletonEnum {INSTANCE;public void doSomething() {System.out.println("Doing something...");}
}
  • 優點:天然線程安全,防止反射攻擊,簡潔優雅。
  • 缺點:功能有限,不適合需要繼承的場景。

靜態內部類

public class SingletonInnerClass {private SingletonInnerClass() {}private static class SingletonHolder {private static final SingletonInnerClass INSTANCE = new SingletonInnerClass();}public static SingletonInnerClass getInstance() {return SingletonHolder.INSTANCE;}
}
  • 優點:延遲加載,線程安全,性能較好。
  • 缺點:實現稍復雜。

6. 總結

  • 餓漢式適合于實例一定會被使用的場景,簡單高效,但可能會浪費資源。
  • 懶漢式適合于實例可能不會被使用的場景,可以延遲加載,但需要注意線程安全問題。
  • 如果追求簡潔和安全性,推薦使用枚舉單例靜態內部類實現。

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

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

相關文章

為 MinIO AIStor 引入模型上下文協議(MCP)服務器

Anthropic 最近宣布的模型上下文協議 (MCP) 將改變我們與技術交互的方式。它允許自然語言通信替換許多任務的復雜命令行語法。不僅如此,語言模型還可以總結傳統工具的豐富輸出,并以人類可讀的形式呈現關鍵信息。MinIO 是世界領先的…

2023年12月電子學會青少年軟件編程四級考級真題—新“跳7”游戲

此題可點下方去處查看,支持在線編程,獲取源碼: 新“跳7”游戲_scratch_少兒編程題庫學習中心-嗨信奧https://www.hixinao.com/tiku/scratch/show-5109.html?_shareid3 程序演示可點擊下方查看,支持源碼查看:新“跳7…

3D 地圖渲染-區域紋理圖添加

引入-初始化地圖&#xff08;關鍵代碼&#xff09; // 初始化頁面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申請的key值></script>// 添加地圖容器 <div idcontainer ></div>// 地圖初始化應該…

如何避免內存泄漏,尤其是在React中

在React中避免內存泄漏主要涉及到兩個方面&#xff1a;組件的卸載清理和異步操作的正確管理。以下是幾個關鍵的策略和最佳實踐&#xff1a; 1. 清理組件中的事件監聽器和定時器 當組件卸載時&#xff0c;確保清除所有綁定的事件監聽器和定時器&#xff0c;否則它們會持續占用內…

如何學習C++以及C++的宏觀認知

學習方法 首先可以給出一個論斷&#xff1a;C的語法和各種組件的原理及使用可以說是所有編程語言里面比較難的 那么如何掌握所有東西&#xff0c;比如網絡編程&#xff0c;文件讀寫&#xff0c;STL。 不要對語法記各種筆記&#xff0c;比如vector容器有什么什么方法什么什么…

Minimind 訓練一個自己專屬語言模型

發現了一個寶藏項目&#xff0c; 宣傳是完全從0開始&#xff0c;僅用3塊錢成本 2小時&#xff01;即可訓練出僅為25.8M的超小語言模型MiniMind&#xff0c;最小版本體積是 GPT-3 的 17000&#xff0c;做到最普通的個人GPU也可快速訓練 https://github.com/jingyaogong/minimi…

Spring Boot 與 Spring Integration 整合教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot 與 Spring Integration 整合教程 簡介 Spring Integration 是 Spring 生態系統中用于實現企業集成模式&#xff08;Enterprise Integration Pa…

Nginx 核心配置詳解與性能優化最佳實踐

1.什么是 Nginx&#xff1f; Nginx 是一個高性能的 Web 服務器和反向代理服務器。它輕量、高效&#xff0c;被廣泛用于現代 Web 開發中。 2.為什么前端需要了解 Nginx&#xff1f; ★ 了解 本地開發&#xff1a;可以模擬生產環境 部署前端項目&#xff1a;作為靜態文件服務器…

LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系統、TileMap等全面升級!

正式版推出前&#xff0c;說明3.3的功能還沒開發完。所以&#xff0c;又一大波更新來了~ 下面對重點更新進行說明。 Spine的重要更新 3.3.0-beta.3版本開始&#xff0c;新增了Spine 4.2 的運行時庫&#xff0c;Spine動畫上可以支持物理特性了。例如&#xff0c;下圖右側女孩在啟…

pip安裝timm依賴失敗

在pycharm終端給虛擬環境安裝timm庫失敗&#xff08; pip install timm&#xff09;&#xff0c;提示你要訪問 https://rustup.rs/ 來下載并安裝 Rust 和 Cargo 直接不用管&#xff0c;換一條命令 pip install timm0.6.13 成功安裝 簡單粗暴

BUUCTF-web刷題篇(7)

16.BackupFile 題目提示backupfile&#xff0c;是備份文件的意思&#xff1a; 查看源碼沒有什么有用信息&#xff0c;也沒有登錄界面&#xff0c;所以也不會用到蟻劍鏈接來找備份文件&#xff0c;所以大概率就是通過構造playload來查找備份文件。 注&#xff1a;備份文件常用…

Maven 構建生命周期

Maven 構建生命周期 引言 Maven 是一個強大的項目管理和構建自動化工具,廣泛應用于 Java 開發領域。Maven 的核心概念之一是構建生命周期,它定義了從項目創建到構建、測試、打包、部署等一系列操作的流程。本文將詳細介紹 Maven 的構建生命周期,幫助讀者更好地理解和使用 …

PyTorch 深度學習實戰(29):目標檢測與 YOLOv12 實戰

在上一篇文章中,我們探討了對比學習與自監督表示學習。本文將深入計算機視覺的核心任務之一——目標檢測,重點介紹最新的 YOLOv12 (You Only Look Once v12) 算法。我們將使用 PyTorch 實現 YOLOv12 模型,并在 COCO 數據集上進行訓練和評估。 一、YOLOv12 基礎 YOLOv12 是 …

使用Leaflet對的SpringBoot天地圖路徑規劃可視化實踐-以黃花機場到橘子洲景區為例

目錄 前言 一、路徑規劃需求 1、需求背景 2、技術選型 3、功能簡述 二、Leaflet前端可視化 1、內容布局 2、路線展示 3、轉折路線展示 三、總結 前言 在當今數字化與智能化快速發展的時代&#xff0c;路徑規劃技術已經成為現代交通管理、旅游服務以及城市規劃等領域的…

深入理解 CSS 選擇器:從基礎到高級的樣式控制

引言 在網頁設計與開發中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;扮演著至關重要的角色&#xff0c;它賦予了 HTML 頁面豐富的視覺效果和交互性。而 CSS 選擇器則是 CSS 的核心機制之一&#xff0c;通過選擇器&#xff0c;我們能夠精準地指定要應用樣式的 HTML 元素…

GitHub與Gitee各是什么?它們的區別與聯系是什么?

李升偉 整理 GitHub 介紹 GitHub 是一個基于 Git 的代碼托管平臺&#xff0c;主要用于版本控制和協作開發。它支持多人協作&#xff0c;提供代碼托管、問題跟蹤、代碼審查、項目管理等功能。GitHub 是全球最大的開源社區&#xff0c;許多知名開源項目都在此托管。 主要功能&…

ESLint語法報錯

ESLint語法報錯 運行報錯 You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.解決方案 關閉eslint的語法檢測&#xff0c;在eslintrc.js文件中…

單例模式與線程安全

目錄 線程安全和重?問題 死鎖和活鎖 死鎖 死鎖四個必要條件 活鎖 STL,智能指針和線程安全 線程安全的單例模式 餓漢模式 懶漢模式 懶漢模式實現單例模式(線程安全版本) 餓漢模式實現單例模式 我們來學習單例模式與線程安全 線程安全和重?問題 線程安全&#xff…

Python+AI提示詞用貝葉斯樣條回歸擬合BSF方法分析櫻花花期數據模型構建跡圖、森林圖可視化

原文鏈接&#xff1a;https://tecdat.cn/?p41308 在數據科學的領域中&#xff0c;我們常常會遇到需要處理復雜關系的數據。在眾多的數據分析方法中&#xff0c;樣條擬合是一種非常有效的處理數據非線性關系的手段。本專題合集圍繞如何使用PyMC軟件&#xff0c;對櫻花花期數據進…

WPF學習路線

WPF學習路線 學習準備學習技術棧學習路線 1-5&#xff08;1-2周&#xff09;6-8&#xff08;3-5周&#xff09; 學習準備 個人認為前端技術一般幾個關鍵字&#xff1a;元素資源 控制元素資源組合或者動態交互 數據交互呈現分析關鍵字得到的就是幾個方向 布局 樣式 組裝資源控件…