【設計模式04】單例模式

前言

整個系統中只會出現要給實例,比如Spring中的Bean基本都是單例的

UML類圖

代碼示例

package com.sw.learn.pattern.B_create.c_singleton;public class Main {public static void main(String[] args) {// double check locking 線程安全+懶加載 ??
//        SingletonDCL instance = SingletonDCL.getInstance();// 靜態內部類 線程安全+懶加載 ????
//        Singleton s1 = Singleton.getInstance();
//        Singleton s2 = Singleton.getInstance();
//        System.out.println(s1 == s2); // true// 枚舉類  線程安全+餓漢式 ??????
//        SingletonEnum.INSTANCE.doSomething();// 基于枚舉內部類的懶漢式單例模式 ????????BeanContainer instance2 = BeanContainer.getInstance();BeanContainer instance3 = BeanContainer.getInstance();System.out.println(instance2 == instance3); // true}
}class Singleton {// 私有構造方法,防止外部實例化private Singleton() {System.out.println("Singleton constructor called.");}// 靜態內部類,只有在第一次調用 getInstance() 時才會加載private static class Holder {private static final Singleton INSTANCE = new Singleton();}// 對外提供獲取實例的方法public static Singleton getInstance() {return Holder.INSTANCE;}
}class SingletonDCL {// 使用 volatile 防止初始化時指令重排序,確保線程安全private static volatile SingletonDCL instance;private SingletonDCL() {System.out.println("SingletonDCL constructor called.");}public static SingletonDCL getInstance() {if (instance == null) { // 第一次檢查(不加鎖) 提高性能synchronized (SingletonDCL.class) {if (instance == null) { // 第二次檢查(加鎖后再檢查) 防止多個線程同時通過第一層檢查后并發創建;instance = new SingletonDCL();}}}return instance;}
}enum SingletonEnum {INSTANCE;public void doSomething() {System.out.println("Doing something with enum singleton.");}
}// 枚舉編譯后效果
//final class SingletonEnum2 extends Enum<SingletonEnum2> {
//    public static final SingletonEnum2 INSTANCE = new SingletonEnum2("INSTANCE", 0);
//
//    private SingletonEnum2(String name, int ordinal) {
//        super(name, ordinal);
//    }
//}class BeanContainer {// 調用getInstance方法時,第一次初始化ContainerHolder枚舉類,初始的時候執行構造方法,實例化BeanContainer對象/*** 第一步:調用 ContainerHolder.HOLDER* JVM 首次訪問 ContainerHolder 時會觸發類加載。* <p>* 內部類不會在外部類加載時加載,只有在首次訪問時才加載(這就是懶加載)。* <p>* 枚舉類加載也是線程安全的,JVM 會保證枚舉類只加載一次,不會有并發初始化問題。** @return*/public static BeanContainer getInstance() {return ContainerHolder.HOLDER.instance;}private enum ContainerHolder {HOLDER; // 容器,裝載了BeanContainer對象/*** 第二步:加載 enum ContainerHolder* 枚舉類 ContainerHolder 加載時,會創建一個 enum 常量 HOLDER。*/private BeanContainer instance;ContainerHolder() {instance = new BeanContainer(); // 會被執行一次,初始化 instance, 即 ContainerHolder.HOLDER 被加載時。}}
}

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

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

相關文章

飛算科技依托 JavaAI 核心技術,打造企業級智能開發全場景方案

在數字經濟蓬勃發展的當下&#xff0c;企業對智能化開發的需求愈發迫切。飛算數智科技&#xff08;深圳&#xff09;有限公司&#xff08;簡稱 “飛算科技”&#xff09;作為自主創新型數字科技公司與國家級高新技術企業&#xff0c;憑借深厚的技術積累與創新能力&#xff0c;以…

20250701【二叉樹公共祖先】|Leetcodehot100之236【pass】今天計劃

20250701 思路與錯誤記錄1.二叉樹的數據結構與初始化1.1數據結構1.2 初始化 2.解題 完整代碼今天做了什么 題目 思路與錯誤記錄 1.二叉樹的數據結構與初始化 1.1數據結構 1.2 初始化 根據列表&#xff0c;順序存儲構建二叉樹 def build_tree(nodes, index0):# idx是root開始…

Web應用開發 --- Tips

Web應用開發 --- Tips General后端需要做參數校驗代碼風格和Api設計風格的一致性大于正確性數據入庫時間應由后端記錄在對Api修改的時候&#xff0c;要注意兼容情況&#xff0c;避免breaking change 索引對于查詢字段&#xff0c;注意加索引對于唯一的字段&#xff0c;考慮加唯…

CSS 安裝使用教程

一、CSS 簡介 CSS&#xff08;Cascading Style Sheets&#xff0c;層疊樣式表&#xff09;是用于為 HTML 頁面添加樣式的語言。通過 CSS 可以控制網頁元素的顏色、布局、字體、動畫等&#xff0c;是前端開發的三大核心技術之一&#xff08;HTML、CSS、JavaScript&#xff09;。…

機器學習中為什么要用混合精度訓練

目錄 FP16與顯存占用關系機器學習中一般使用混合精度訓練&#xff1a;FP16計算 FP32存儲關鍵變量。 FP16與顯存占用關系 顯存&#xff08;Video RAM&#xff0c;簡稱 VRAM&#xff09;是顯卡&#xff08;GPU&#xff09;專用的內存。 FP32&#xff08;單精度浮點&#xff09;&…

[附源碼+數據庫+畢業論文+答辯PPT]基于Spring+MyBatis+MySQL+Maven+vue實現的中小型企業財務管理系統,推薦!

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本中小型企業財務管理就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信…

華為云Flexus+DeepSeek征文 | 對接華為云ModelArts Studio大模型:AI賦能投資理財分析與決策

引言&#xff1a;AI金融&#xff0c;開啟智能投資新時代?? 隨著人工智能技術的飛速發展&#xff0c;金融投資行業正迎來前所未有的變革。??華為云ModelArts Studio??結合??Flexus高性能計算??與??DeepSeek大模型??&#xff0c;為投資者提供更精準、更高效的投資…

從模型部署到AI平臺:云原生環境下的大模型平臺化演進路徑

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;部署只是起點&#xff0c;平臺才是終局 在過去一年&#xff0c;大語言模型的飛速發展推動了AI生產力浪潮。越來越多…

UI前端大數據可視化創新:利用AR/VR技術提升用戶沉浸感

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在大數據與沉浸式技術高速發展的今天&#xff0c;傳統二維數據可視化已難以滿足復雜數據場景的…

MacOS 安裝brew 國內源【超簡潔步驟】

?/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"請輸入序號&#xff1a;1

GENESIS64:全球知名的工業設備監控與可視化平臺

一、概述 GENESIS64是一款由ICONICS開發的先進工業自動化軟件平臺&#xff0c;專為實現實時數據可視化、智能化監控及管理而設計。該平臺采用模塊化架構&#xff0c;具有高效的數據處理能力和靈活的擴展性&#xff0c;適用于各類工業環境&#xff0c;幫助企業實現自動化運營&a…

RNN(Recurrent Neural Network,循環神經網絡)家族詳解(RNN,LSTM,GRU)

文章目錄 一、RNN基礎&#xff1a;序列建模的核心思想1.1 RNN的本質與核心機制1.2 應用場景與結構分類 二、傳統RNN&#xff1a;序列模型的起點2.1 內部結構與數學表達2.2 計算示例2.3 RNN在Pytorch中的API2.4 代碼示例2.5 優缺點與梯度問題 三、LSTM&#xff1a;門控機制破解長…

多云密鑰統一管理實戰:CKMS對接阿里云/華為云密鑰服務

某保險公司因阿里云KMS密鑰與華為云密鑰割裂管理&#xff0c;導致勒索事件中解密失敗&#xff01;據統計&#xff0c;73%企業因多云密鑰分散管理引發數據恢復延遲&#xff08;IDC 2024&#xff09;。本文將詳解安當CKMS統一納管方案&#xff0c;實現跨云密鑰全生命周期管控&…

光伏接入承載力計算仿真:基于圖計算技術的自動建模技術研究

光伏接入承載力計算仿真:基于圖計算技術的自動建模技術研究 一、 引言:挑戰與機遇 光伏發電的大規模接入對中低壓配電網的安全穩定運行帶來了巨大挑戰。精確評估電網對光伏的承載力(Hosting Capacity, HC)是保障消納與安全的關鍵。傳統承載力評估嚴重依賴電網仿真,而仿真…

如何在Excel中每隔幾行取一行

如何在Excel中每隔幾行取一行 摘要&#xff1a; Excel中快速實現每隔n行取一行的技巧&#xff1a;使用OFFSET函數配合ROW函數即可實現。公式為OFFSET(起始單元格,(ROW(A1)-1)*n,)&#xff0c;其中n為間隔行數。例如從A2開始每2行取一行&#xff0c;公式為OFFSET(A2,(ROW(A1)-1)…

【MariaDB】MariaDB Server 11.3.0 Alpha下載、安裝、配置

MariaDB是一個開源關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;由MySQL的原始開發者Michael Widenius主導開發。作為MySQL的分支&#xff0c;MariaDB旨在保持與MySQL的高度兼容性&#xff0c;同時提供性能優化、新功能和更好的開源承諾。 目錄 MariaDB下載 …

如何保證緩存和數據庫的雙寫一致性

程序員面試資料大全&#xff5c;各種技術書籍等資料-1000G IDEA開發工具- FREE 一、雙寫一致性問題本質 在分布式系統中&#xff0c;緩存與數據庫雙寫一致性指當數據被修改時&#xff0c;如何確保緩存&#xff08;如Redis&#xff09;和數據庫&#xff08;如MySQL&#xff09…

Qt 5.9 XML文件寫入指南

Qt 5.9 XML文件寫入指南 在Qt 5.9中&#xff0c;有多種方法可以編寫XML文件。下面我將介紹三種主要方法&#xff0c;并提供完整的代碼示例和最佳實踐。 三種XML寫入方法對比 方法優點缺點適用場景QXmlStreamWriter高效、內存占用低無樹形結構大型XML文件QDomDocument樹形結構…

一些ubuntu命令記錄(持續補充)

一、查看代碼運行占用的內存 1、使用 top 命令 top 命令是一個實時的系統監控工具&#xff0c;可以顯示當前系統中所有進程的資源使用情況。運行以下命令&#xff1a; top 在 top 界面中&#xff0c;可以看到每個進程的內存使用情況&#xff08;%MEM 列&#xff09;。 如何…

今日學習:音視頻領域入門文章參考(待完善)

音視頻領域概覽 入門文章參考 CSDN 雷神 博客園 2022-5-22