JAVA經典單例模式

前言

單例模式(Singleton Pattern)是一種創建型設計模式,確保一個類僅有一個實例,并提供全局訪問點。它在需要控制資源(如數據庫連接、配置管理)或避免重復創建對象的場景中廣泛應用。

一,核心概念與特點

  1. 唯一性確保在整個應用程序生命周期中,一個類只有一個實例存在。
  2. 全局訪問點通過靜態方法(如getInstance())提供唯一實例的訪問入口。
  3. 延遲加載部分實現在首次調用時才創建實例,節省資源。

二, 實現方式及代碼示例

1.餓漢式單例模式(Eager Initialization)

特點:類加載時立即初始化實例,線程安全但可能浪費資源。

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

private static final Singleton INSTANCE = new Singleton();定義了一個私有的,靜態的,不可改變的Singleton類實例(單例模式中類唯一生成的對象INSTANCE)。在類加載時立即初始化實例,靜態意味著這個實例屬于類本身,而不是類的某個具體對象。私有確保了這個實例只能在類內部訪問。這意味著這個實例一旦初始化后就不能被改變。

private Singleton() {}是一個私有的構造方法也是單例模式的核心,防止類的外部通過new關鍵字來創建SingleTon類的實例,使得外部無法直接實例化這個類。

public static Singleton getInstance() { return INSTANCE; }這個靜態方法是用來獲取SingleTon類的唯一實例(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;}
}

private static Singleton instance;私有靜態變量,用于持有類的唯一實例。instance屬于類本身,而不是類的某個實例。與餓漢模式不同,實例創建時間被推遲

private Singleton() {};私有構造方法,防止外部通過new創建類的實例。

public static Singleton getInstance(){};用于獲取類的唯一實例。如果實例為空,則創建SingleTon實例;否則,返回已存在的實例。

線程不安全:若線程A和線程B同時調用getInstance()切均檢測到instance==null,會各自執行new SingleTon(),生成兩個不同的實例,破壞單例唯一性。

即使實例已經被創建,其他線程可能因為緩存未刷新,仍讀到null。

為此進行優化。

3.雙重檢查鎖(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;}
}

private static volatile DCLSingleton instance;volatile確保多線程環境下的可見性:當一個線程更新了 instance 變量后,其他線程會立即看到更新后的值。和有序性:禁止指令重排序,new Singleton()的步驟(分配內存--->初始化對象--->賦值引用)可能被重新排序(分配內存--->賦值引用--->初始化對象)若未初始化完成時其他線程訪問instance,會得到未完全構造的對象。volatile會確保對象完全初始化后才暴露引用。

在唯一訪問節點getInstance方法中中采用雙重null檢索機制,第一次檢查,如果instance為null,才進入同步塊。synchronized (Singleton.class)對DCLSingleton()進行同步,確保同一時刻只有一個線程可以執行該代碼塊,防止多個線程突破第一次檢查后重復創建實例。第二次檢查在進入同步塊后,instance仍然為null,才創建實例。

這種單例模式常用于高并發下需要懶加載(類加載時沒有立即初始化實例)的單例且要求線程安全的場景,例如數據庫連接池,配置管理等。

總結

餓漢式單例啟動立即開始初始化,占用內存但是訪問速度快,以空間換時間;懶漢式單例延遲加載,省內存,以時間換空間

餓漢式適用于實例輕量,高并發頻繁訪問(如工具類)。

懶漢式適用于重量級實例,需懶加載。

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

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

相關文章

20250715問答課題-基于BERT與混合檢索問答系統

1. 引言構建一個基于BERT與混合檢索策略的智能問答系統,通過深度學習與傳統檢索技術的融合,解決了心法領域知識檢索中的三個關鍵問題:(1)專業術語的語義理解不足;(2)問答匹配精度低;(3)檢索結果多樣性差。2. 方法2.1. …

面向對象與面向過程、函數式編程

面向對象與面向過程、函數式編程 1. 面向過程編程(Procedure-Oriented Programming) 面向過程編程將程序視為一系列函數的集合,數據和操作數據的函數是分離的。在 Vue 3 中,這種風格通常表現為使用組合式 API(Composit…

基于大數據的淘寶用戶行為數據分析系統的設計與實現

開發環境開發語言:Java 框架:springboot JDK版本:JDK1.8 服務器:tomcat7 數據庫:mysql5.7(一定要5.7版本) 數據庫工具:Navicat11 開發軟件:eclipse/myeclipse/idea Maven…

視頻人臉處理——人臉面部動作提取

文章目錄基于openface實現的技術方案windows環境下使用1. 安裝依賴軟件2. 下載OpenFace代碼3. 編譯OpenFace4. 提取面部動作單元5.選擇提取目標方案liunx環境下使用安裝與配置使用 OpenFace 提取面部動作單元應用場景基于py-feat實現的方案1. 從HuggingFace下載模型并設置Detec…

【Docker基礎】Dockerfile構建與運行流程完全指南:從原理到實踐優化

目錄 引言 1 docker build命令參數詳解 1.1 命令概述 1.2 常用參數詳解 1.2.1 -t, --tag 1.2.2 -f, --file 1.2.3 --build-arg 1.2.4 --no-cache 1.2.5 --pull 1.3 構建流程圖解 2 構建上下文(Context)優化技巧 2.1 構建上下文定義 2.2 優化…

StarRocks Community Monthly Newsletter (Jun)

版本動態 v3.5.0 存算分離:支持生成列、主鍵表重建索引;大規模導入邏輯優化,降低小文件數量。 數據湖分析:Beta 支持 Iceberg 視圖創建與修改;支持 Iceberg REST Catalog 嵌套命名空間; 性能提升與查詢優…

HDMI接口 vs. DisplayPort接口:電競玩家該如何選擇更優?

在搭建游戲主機或電競PC時,顯示器接口的選擇(HDMI vs. DP)會直接影響畫質、刷新率和延遲表現。本文將從分辨率、刷新率、可變刷新率(VRR)、帶寬、兼容性等角度對比,幫你選出最適合游戲的接口。1. 基礎對比&…

論文筆記:Learning Cache Replacement with CACHEUS

2021 USENIX GitHub - sylab/cacheus: The design and algorithms used in Cacheus are described in this USENIX FAST21 paper and talk video: https://www.usenix.org/conference/fast21/presentation/rodriguez Learning Cache Replacement with CACHEUS 1 intro 基于…

極致cms多語言建站|設置主站默認語言與設置后臺固定語言為中文

小記 很長時間沒有建站了,最近有需求所以又回爐了,使用的極致cms 極致cms幫助文檔 | 極致CMS幫助文檔 由于很長時間沒做,又遇到了之前碰到的兩個問題,憑借經驗和記憶還是處理掉了 1.當網站前臺使用?len或?lzh來切換語言時,管…

Linux Vim 編輯器詳解:從入門到進階(含圖示+插件推薦)

前言在 Linux 的世界中,Vim 是一款被無數開發者喜愛和追捧的強大文本編輯器。如果你厭倦了鼠標點來點去,不妨試試 Vim —— 一款專注于高效鍵盤操作的“終極利器”。本文將帶你全面了解 Vim 的基本概念、模式切換、常用命令、窗口管理,并附上…

web前端渡一大師課 01 事件循環

一. 瀏覽器的進程模型 1.何為進程?程序運行需要有它自己專屬的內存空間,可以把這塊內存空間簡單理解為進程 每個應用至少有一個進程,進程之間相互獨立,即使要通信,也需要雙方同意 2.何為線程?有了進程后,就可以運行程序的代碼了,運行代碼的"人",稱之為"線程&…

linux網絡存儲——freeNAS的安裝配置

一、前言 freeNAS 是一款基于 FreeBSD 的開源網絡存儲操作系統,支持文件共享(如 SMB/CIFS、NFS、AFP)、數據備份、虛擬化存儲等功能。同時FreeNAS開源優勢明顯,代碼開放可自主定制,能滿足多樣需求。支持多種協議…

深度學習圖像分類數據集—七種樹葉識別分類

該數據集為圖像分類數據集,適用于ResNet、VGG等卷積神經網絡,SENet、CBAM等注意力機制相關算法,Vision Transformer等Transformer相關算法。 數據集信息介紹:七種樹葉識別分類:[冬青葉, 楊樹葉, 柳葉, 梧桐葉, 石楠葉,…

c++圖形題練習程序

一.練習題背景 這題是作者再一家公司實習的時候,實習期間的一個考核題目,感覺還是比較有價值的。希望能給還在努力的學弟學妹們一些啟發。 題目大致就是要求用繼承和多態來實現圓、三角形和長方形的面積和周長求解。這步的大致思路是這樣的,你…

【論文閱讀 | PR 2024 |ITFuse:一種用于紅外與可見光圖像融合的交互式 Transformer】

論文閱讀 | PR 2024 |ITFuse:一種用于紅外與可見光圖像融合的交互式 Transformer1.摘要&&引言2.方法2.1 問題表述2.2 框架概述2.3 特征交互模塊2.3.1 共同特征提取分支(IcI_{c}Ic? 分支)2.3.2 獨特特征提取分支(I1I_{1}I…

【Qt】 設計模式

在Qt應用程序開發中,結合數據庫操作、通信、界面邏輯和顯示等功能,以下是常用的設計模式及其典型應用場景: 一、MVC/MVVM(模型-視圖-控制器/視圖模型) 作用:分離數據(模型)、界面&am…

【HarmonyOS】ArkUI-X 跨平臺框架入門詳解(一)

【HarmonyOS】ArkUI-X 跨平臺框架入門詳解(一) 一、前言 1、ArkUI-X框架是什么? ArkUI-X是在ArkUI開發框架的基礎上,進行擴展。支持多個OS平臺,目前支持OpenHarmony、HarmonyOS、Android、 iOS。2、ArkUI-X目前的能力現…

開發者進化論:駕馭AI,開啟軟件工程新紀元

導語:人工智能(AI)的浪潮,特別是以大型語言模型(LLM)為代表的生成式AI,正以前所未有的力量,深刻地重塑著軟件開發的傳統疆域。我們正處在一個關鍵的轉折點——產業的重心正從模型的“…

智慧水務平臺,智慧水務,惠及民生,提升水務管理效率與服務質量

平升電子智慧水務平臺支持海量物聯網數據接入實現供水全流程信息化,深度邏輯運算自動控制實現供水調度智慧化,融入管網地理信息系統實現測點數據時空化,數字孿生實現水廠各工藝環節運行情況可視化,多角度統計分析實現水務運營管理…

【Unity基礎】Unity中元素的層級排序

在Unity中,控制元素的層級排序(渲染順序)是確保場景正確顯示的關鍵。以下是常見的層級排序方式及其適用場景:1. 通過GameObject的層級順序(Sorting Layer/Order in Layer) 適用對象:2D精靈&…