單例模式,餓漢式,懶漢式,在java和spring中的體現

目錄

餓漢式單例模式

懶漢式單例模式

Spring中的單例模式

關鍵差異對比

在Java和Spring中的應用場景

手寫案例

單例模式是一種創建型設計模式,其核心在于確保一個類僅有一個實例,并提供一個全局訪問點來獲取該實例。下面將詳細介紹餓漢式和懶漢式單例模式,以及它們在Java和Spring框架中的體現。

餓漢式單例模式

這種模式的特點是類加載時就創建實例,無需等待首次使用。它不存在線程安全問題,因為實例的創建是在類加載階段完成的。

Java實現示例

public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return INSTANCE;}
}

懶漢式單例模式

懶漢式單例模式是在首次使用時才創建實例。不過,在多線程環境下,如果沒有合適的同步機制,就可能會創建多個實例。

非線程安全的Java實現示例

public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

線程安全的Java實現示例

public class ThreadSafeLazySingleton {private static volatile ThreadSafeLazySingleton instance;private ThreadSafeLazySingleton() {}public static ThreadSafeLazySingleton getInstance() {if (instance == null) {synchronized (ThreadSafeLazySingleton.class) {if (instance == null) {instance = new ThreadSafeLazySingleton();}}}return instance;}
}

Spring中的單例模式

在Spring框架里,默認情況下,所有的bean都是以單例模式創建的,也就是在整個應用上下文中只存在一個實例。

Spring單例bean示例

@Component
public class SpringSingleton {// Spring會自動管理這個bean的單例實例
}

獲取Spring單例bean的方式

@Autowired
private SpringSingleton springSingleton;

關鍵差異對比

維度

餓漢式

懶漢式(線程安全)

實例創建時機

類加載時

首次調用時

線程安全性

安全

安全

優點

實現簡單,無需考慮線程安全問題

延遲加載,節省資源

缺點

可能造成資源浪費

實現較為復雜,性能可能受影響

適用場景

實例創建成本低,且一定會被使用

實例創建成本高,或不一定會被使用

在Java和Spring中的應用場景

  • Java中的應用:像日志記錄器、數據庫連接池這類需要全局唯一實例的場景,會用到單例模式。
  • Spring中的應用:Spring框架默認將bean配置為單例,這樣可以減少內存開銷,同時保證狀態管理的一致性。

理解單例模式的不同實現方式以及它們在Java和Spring中的應用,有助于設計出高效且線程安全的應用程序。

手寫案例

public class Main { }// 單例模式 初始化bean// 餓漢式 單例初始化
// 在類首次加載時就進行初始化 不需要考慮線程安全問題
class  Hungrybean{private static final Hungrybean INSTANCE = new Hungrybean();public static Hungrybean getInstance() {return INSTANCE;}
}// 懶漢式 單例初始化
// 在使用時再進行初始化 可能存在線程安全問題
class  Lazybean{private static Lazybean INSTANCE ;public static Lazybean getInstance() {if(INSTANCE==null){INSTANCE=new Lazybean();}return INSTANCE;}
}// 鎖機制 修復了懶漢是的線程安全問題
class ThreadSafeLazybean{private static ThreadSafeLazybean INSTANCE;public static ThreadSafeLazybean getInstance(){if(INSTANCE==null){synchronized (ThreadSafeLazybean.class){if (INSTANCE==null){INSTANCE=new ThreadSafeLazybean();}return INSTANCE;}}}
}

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

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

相關文章

網絡編程——UDP網絡編程

文章目錄 1、sendto(),recvfrom() 與TCP編程不同的是: 無需建立連接,在recvfrom()阻塞等待客戶端的數據,收到數據后進入do something進行數據的處理。 1、sendto(),recvfrom() ssize_t sendto(int socket, void *mes…

OpenSSL詳解

這里寫目錄標題 選項:**通用選項:**1. genrsa:生成RSA密鑰對3. req:生成證書簽名請求4. x509:生成自簽名證書 **證書管理:**1. verify:驗證證書2. x509:查看證書詳情3. crl&#xff…

MySQL的日志和備份

目錄 一. MySQL的日志 1.1 日志的作用 1.2 日志的分類 1.3 事務日志 1.4 錯誤日志 1.5 通用日志 1.6 慢查詢日志 1.7 二進制備份 二. 備份 2.1 數據備份的重要性 2.2 備份的分類 2.3 MySQL備份的內容 2.4 備份的注意點 2.5 備份的工具 2.6 實戰案例 2.7 mysql…

前端性能優化:如何讓網頁加載更快?

摘要 想象一下,滿心期待點開一個網頁,卻等了十幾秒還卡在加載界面,你是不是瞬間就想關掉走人?這可不是個別用戶的 “急性子”,數據顯示,網頁每多延遲 1 秒,用戶流失率可能增加 11%!…

[論文閱讀]Prompt Injection attack against LLM-integrated Applications

Prompt Injection attack against LLM-integrated Applications [2306.05499] Prompt Injection attack against LLM-integrated Applications 傳統提示注入攻擊效果差,主要原因在于: 不同的應用對待用戶的輸入內容不同,有的將其視為問題&a…

微信小程序進階第2篇__事件類型_冒泡_非冒泡

在小程序中, 事件分為兩種類型: 冒泡事件, 當一個組件上的事件被觸發后,該事件會向父節點傳遞非冒泡事件, 當一個組件上的事件被觸發后, 該事件不會向父節點傳遞。 一 冒泡事件 tap, touchst…

[免費]SpringBoot+Vue在線教育(在線學習)系統(高級版)【論文+源碼+SQL腳本】

大家好,我是java1234_小鋒老師,看到一個不錯的SpringBootVue在線教育(在線學習)系統(高級版)【論文源碼SQL腳本】,分享下哈。 項目視頻演示 【免費】SpringBootVue在線教育(在線學習)系統(高級版) Java畢業設計_嗶哩嗶哩_bilibili 項目介紹…

TypeScript 針對 iOS 不支持 JIT 的優化策略總結

# **TypeScript 針對 iOS 不支持 JIT 的優化策略總結** 由于 iOS 的 **JavaScriptCore (JSC)** 引擎 **禁用 JIT(Just-In-Time 編譯)**,JavaScript 在 iOS 上的執行性能較差,尤其是涉及動態代碼時。 **TypeScript(T…

項目部署一次記錄

鏈路:(用戶)客戶端 → Nginx:192.168.138.100→ Tomcat (程序):192.168.138.101→ MySQL/Redis 打開數據庫:systemctl start mysqld 重啟網絡: systemctl restart NetworkManager 關閉防火墻&am…

C 語言學習筆記

文章目錄 程序設計入門 --- C 語言第一周 程序設計與 C 語言1 計算機與編程語言:計算機怎么做事情的,編程語言是什么📒 1.1 計算機的普遍應用 —— 離了它,現代人可能不會“活”了**🌐 科學計算:計算機的“…

服務器修改/home的掛載路徑

寫在前面:前段時間新裝了一臺服務器,/home目錄原本是掛在在系統盤/dev/sda4的分區下,但是系統盤的空間比較小,為了保證后續使用起來,不會遇到磁盤很快就占滿的情況,現在需要將 /home 獨立出來,掛…

刷機維修進階教程-----沒有開啟usb調試 如何在鎖定機型的撥號界面特殊手段來開啟ADB

有時候我們會遇到一些機型被屏幕鎖 賬號鎖等鎖定。無法進入系統界面。也沒有開啟usb調試的情況下如何通過一些操作來開啟adb調試。然后通過adb指令來禁用對應的app順利進入系統。以此來操作保數據等操作. 通過博文了解?????? 1??????----了解一些品牌機型鎖定狀態…

虛擬文件(VFS)

核心知識點:虛擬文件系統(VFS) 1. 通俗易懂的解釋 想象一下你家里的冰箱。你把食物放進去,不用管它是放在塑料盒里、玻璃罐里還是直接用保鮮膜包著,你只需要知道它在冰箱的哪個位置(比如“蔬菜抽屜里”&a…

前后端聯調實戰指南:Axios攔截器、CORS與JWT身份驗證全解析

前言 在現代Web開發中,前后端分離架構已成為主流,而前后端聯調則是開發過程中不可避免的關鍵環節。本文將深入探討前后端聯調中的三大核心技術:Axios攔截器的靈活運用、CORS跨域問題的全面解決方案以及JWT身份驗證的安全實現。通過本文&…

Postman基礎操作

1.Postman是什么? Postman是接口測試的工具,簡單來說它能模擬瀏覽器對服務器的某個接口發起請求并接收響應數據。 1.1 Postman工作原理 2.Postman發送請求 2.1 發送GET請求 我們知道GET請求是沒用請求體的,所以我們需要將請求參數寫在Param…

Elasticsearch Synthetic _source

_source 字段包含索引時傳入的原始 JSON 文檔體。_source 字段本身不被索引(因此不可搜索),但會被存儲,以便在執行獲取請求(如 get 或 search)時返回。 如果磁盤使用很重要,可以考慮以下選項&a…

Vue3 + Element Plus 實現用戶管理模塊

本文介紹一個使用 Vue3 Element Plus 實現的用戶與小組管理模塊,支持用戶的增刪改查(CRUD)和分頁管理,以及小組的新增和刪除功能,適用于管理后臺系統中的用戶權限管理場景。 一、項目簡介 該模塊具備以下功能&#…

Python應用“面向對象”小練習

大家好!面向對象編程是一種以 “對象” 為核心的編程思想。對象可以看作是具有特定屬性和行為的實體。例如,一個學生可以是一個對象,他的屬性包括姓名和年齡,行為可以是打招呼。? 代碼呈現: # 定義類和對象 class Student:def __init__(sel…

線性回歸原理推導與應用(八):邏輯回歸二分類乳腺癌數據分類

乳腺癌數據是sklearn中自帶的數據集,需要通過相關特征對是否患有乳腺癌進行分類。 數據清洗與建模 首先加載相關庫和相關數據 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression import numpy as np import…

nginx的一些配置的意思

1.用這個端口可以訪問到nginx 2.工作進程,設置成和cpu核心數一樣即可 3.每個工作進程的最大網絡連接數。 4.主機名稱 設置反向代理時,把server_name設置成ip。 5.反向代理進行轉發,localhost指的是nginx所在的機器。 關鍵字proxy_pass。 …