Java—單例模式

什么是單例模式?

單例模式是一種軟件設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例。在單例模式中,類自身負責創建自己的唯一實例,并且保證在整個應用程序中只能訪問到這個實例。

實現步驟:

  1. 私有化構造方法;
    1. 私有化構造方法,防止通過new 創建對象。
  2. 提供靜態方法入口;
    1. 對外提供一個公開的靜態方法,獲取類的唯一實例入口。
    2. 定義成靜態是為了能通過類訪問,因為私有化構造方法,外界無法獲取實例對象,所以不能通過實例對象訪問。
  3. 定義靜態變量;
    1. 定義一個私有的單例類的靜態變量,在類加載的時候,初始化靜態變量。
    2. 為什么是私有的:
      1. 保護單例類的安全性,禁止外界對單例類的改變。
      2. 保證單例類的唯一性,不能修改唯一實例對象。
    3. 為什么是靜態的:
      1. 因為入口方法是靜態的,靜態方法中只能訪問靜態成員變量。
      2. 也符合靜態的特征,在類加載時,初始化靜態變量,且只執行一次。

實現(餓漢式):

? ? ? ? 1. 提前創建好單例實例對象。

? ? ? ? 2. 調用時,直接返回創建好的單例實例對象。

/**
*	單例模式:
* 		餓漢式
*/
public class Singleton {private String name;// 唯一實例對象, 靜態變量private  static Singleton singleton = new Singleton();// 私有化構造方法; 外界就不能創建當前類對象了。private Singleton(){}// 提供一個外界可以獲取唯一實例的入口public static Singleton getInstance(){return singleton;}public String getName(){return name;}public void setName(String name){this.name = name;}
}	

實現(懶漢式):

? ? ? ? 1. 在用到時,才創建單例實例對象。

? ? ? ? 2. 調用時,判斷是否已經創建過單例實例對象,如果創建過直接返回,否則創建再返回。

/**
*     單例模式:
*          懶漢式
*/
public class Singleton {private String name;// 唯一實例對象,但是不初始化private static Singleton singleton;// 訪問入口,獲取單例實例對象的唯一入口。public static Singleton getInstance(){// 如果對象為空,說明時第一次訪問,創建單例實例對象。if( singleton == null){singleton = new Singleton();}return singleton;}public String getName(){reutnr name;}public void setName(String name){this.name = name;}
}

多線程環境實現:

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;}protected Object readResolve() {return getInstance();}
}

在上述代碼中,通過添加volatile關鍵字修飾instance變量,確保多線程環境下對該變量的可見性和有序性,避免了線程安全問題。

在靜態方法getInstance()中,首先檢查instance是否為null,如果為null才會進入同步塊。在同步塊內部再次判斷instance是否為null,這是為了防止多個線程同時通過第一個判斷,并同時進入同步塊創建實例,從而導致多個實例的產生。

此外,還需要注意到readResolve()方法的存在。當單例類被序列化后再進行反序列化時,可能會生成新的實例,為了避免這種情況,可以添加readResolve()方法,并在方法內返回單例實例。這樣可以確保反序列化后獲得的對象仍然是同一個實例。

這是一個完整版的單例模式示例代碼,通過雙重檢查鎖定和防止反射攻擊的處理,保證了單例類的線程安全性和唯一性。

餓漢式和懶漢式的區別:

餓漢式和懶漢式是兩種常見的單例模式實現方式,它們的區別主要體現在初始化時機和線程安全性上。

  1. 餓漢式:

    • 在類加載的時候就創建了對象實例,無論是否使用都會創建。
    • 在類加載過程中就完成了實例化,因此不存在多線程并發的問題。
    • 可能會浪費一些資源,因為不管有沒有使用到該實例,都會提前創建。
  2. 懶漢式:

    • 延遲實例化,只有在第一次使用時才會創建對象實例。
    • 在多線程環境下,需要考慮并發訪問的線程安全問題。
    • 相比餓漢式,懶漢式在不使用時不會提前創建實例,節省了一些資源。

需要注意的是,在多線程環境下使用懶漢式時,需要進行額外的處理來保證線程安全性,以避免多個線程同時創建多個實例。常見的線程安全處理方式包括使用 synchronized 關鍵字、雙重檢查鎖定等。

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

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

相關文章

IDEA通過tomcat運行注意事項

配置run--》edit configurations 以下的A B部分要保持一致 A和B的路徑要保持一致

前端vue項目遇到的問題01——那些初級問題

前端vue項目遇到的問題01——那些初級問題 1. npm install 問題1.1 依賴沖突1.1.1 詳細問題1.1.2 報錯原因1.1.3 解決問題1.1.3.1 方式1——無視沖突1.1.3.1 方式2——更換依賴版本 1.2 nodejs版本問題1.3 node版本正確的情況(audit問題)(這個…

Java鏈表簡介

在Java中使用鏈表作為一種數據結構,并將其與MySQL作為底層數據庫進行集成,涉及幾個關鍵方面,包括數據存儲、數據操作的效率、以及如何在應用層和數據庫層之間映射數據結構。下面是對這些方面的分析: ### Java中的鏈表數據結構 鏈…

HTML5新特性、JS【初識JS 、JS核心語法】--學習JavaEE的day47

day47 HTML5新特性 定義文檔類型 在文件的開頭總是會有一個標簽 語言文檔類型聲明方式html4<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">html5<!DOCTYPE html> 新增語義化標簽 理解&…

vite-plugin-vue-devtools插件

vite-plugin-vue-devtools插件旨在幫助開發者更快地理解并調試Vue應用。它通過提供全面的功能和直觀的界面&#xff0c;以圖形化的方式展示應用程序狀態&#xff0c;使開發者能夠更方便地查看和管理Vue應用的各個方面。此外&#xff0c;該插件還支持Vue3.0版本&#xff0c;并且…

【Go專家編程——內存管理——垃圾回收】

垃圾回收 所謂的垃圾就上不在需要的內存塊&#xff0c;垃圾如果不清理&#xff0c;這些內存塊就沒有辦法再次被分配使用。在不支持垃圾回收的編程語言中&#xff0c;這些垃圾內存就上泄露的內存。 1. 垃圾回收算法 常見的垃圾回收算法有3種 引用計數&#xff1a;對每個對象…

yolov10 快速使用及訓練

參考: https://docs.ultralytics.com/models/yolov10/ ultralytics其實大多數系列都能加載使用: 官方: https://github.com/THU-MIG/yolov10.git 代碼參考: https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/train-yolov10-object-…

一篇文章講透排序算法之希爾排序

希爾排序是對插入排序的優化&#xff0c;如果你不了解插入排序的話&#xff0c;可以先閱讀這篇文章&#xff1a;插入排序 目錄 1.插入排序的問題 2.希爾排序的思路 3.希爾排序的實現 4.希爾排序的優化 5.希爾排序的時間復雜度 1.插入排序的問題 如果用插入排序對一個逆序…

521源碼-免費代碼基礎學習-PHP如何運用變量教程

更多網站源碼學習教程&#xff0c;請點擊&#x1f449;-521源碼-&#x1f448;獲取最新資源 為什么要學習PHP&#xff1f;“我可以用JavaScript來實現程序編寫。”但JavaScript的能力是有限的&#xff0c;JavaScript通常運行在瀏覽器&#xff08;客戶端&#xff09;&#xff0…

go語言中for的4種循環形式總結

和其他語言不一樣&#xff0c;go語言中的循環語句只有for一種&#xff0c;但是go里面的for卻有3種不同的循環形式&#xff0c;總結如下&#xff1a; 1. 無限循環 for { //這個就是一個“死循環”&#xff0c;注意必須要有 break條件&#xff0c;否則就真成死循環了 } 2. fo…

Redis 源碼學習記錄:集合 (set)

無序集合 Redis 源碼版本&#xff1a;Redis-6.0.9&#xff0c;本篇文章無序集合的代碼均在 intset.h / intset.c 文件中。 Redis 通常使用字典結構保存用戶集合數據&#xff0c;字典鍵存儲集合元素&#xff0c;字典值為空。如果一個集合全是整數&#xff0c;則使用字典國語浪費…

PostgreSQL入門教程

PostgreSQL是一種開源的關系型數據庫管理系統&#xff0c;它具有高度的可靠性、可擴展性和性能。下面是一個簡單的PostgreSQL入門教程&#xff0c;幫助你開始使用這個強大的數據庫管理系統。 步驟1&#xff1a;安裝PostgreSQL 首先&#xff0c;你需要下載并安裝PostgreSQL。你…

2024年最全的信息安全、數據安全、網絡安全標準分享(可下載)

以上是資料簡介和目錄&#xff0c;如需下載&#xff0c;請前往星球獲取&#xff1a;https://t.zsxq.com/Gz1a0

【全網最全】2024電工杯數學建模A題成品論文+前三題完整解答matlab+py代碼等(后續會更新成品論文)

您的點贊收藏是我繼續更新的最大動力&#xff01; 一定要點擊如下的卡片鏈接&#xff0c;那是獲取資料的入口&#xff01; 【全網最全】2024電工杯數學建模A題成品論文前三題完整解答matlabpy代碼等&#xff08;后續會更新成品論文&#xff09;「首先來看看目前已有的資料&am…

Python 點云平面分割【RANSAC算法】

點云平面分割 一、介紹1.1 概念1.2 算法思路1.3 參數設置二、代碼示例三、結果示例其他參考鏈接:C++中實現點云平面分割 一、介紹 1.1 概念 點云平面分割:可以在點云數據中找到平面并計算平面模型系數,同時輸出平面點云及非平面點云。 1.2 算法思路 實現思路: 首先,采用…

Sass是什么?有哪些優缺點?

目錄 一、Sass是什么&#xff1f; 二、Sass的優缺點 三、Sass與SaaS 一、Sass是什么&#xff1f; Sass是世界上最成熟、最穩定、最強大的專業級CSS擴展語言。 Sass makes CSS fun again. Sass is an extension of CSS, adding nested rules, variables, mixins, selector in…

【C++高階(一)】繼承

目錄 一、繼承的概念 1.繼承的基本概念 2.繼承的定義和語法 3.繼承基類成員訪問方式的變化 ?編輯 4.總結 二、基類和派生類對象賦值轉換 三、繼承中的作用域 四、派生類的默認成員函數 1.派生類中的默認構造函數 2.派生類中的拷貝構造函數 3.派生類中的移動構造函數…

英語學習筆記25——Mrs. Smith‘s kitchen

Mrs. Smith’s kitchen 史密斯太太的廚房 詞匯 Vocabulary Mrs. 夫人【已婚】 復習&#xff1a;Mr. 先生 全名 / 姓    Mrs. 夫人 全名 / 丈夫的姓    Miss 小姐&#xff08;未婚&#xff09; 全名 / 姓    Ms. 女士 全名 / 姓 查看婚姻狀況&#xff0c;可以觀察…

springboot項目中圖片上傳之后需要重啟工程才能看到圖片?

需求背景 最近在做一個用戶自定義上傳頭像的小需求&#xff0c;用戶上傳頭像然后需要立馬回顯。 需求是很常見的、正當的需求。如果不使用到對象存儲這類服務&#xff0c;我們把用戶頭像的圖片文件僅存在本地就可以了。我們在開發的過程中為了工程管理方便通常下意識會將圖片…

freertos串口DMA隊列發送卡死

調試回調函數的時候&#xff0c;我在cube中刪除了默認的DMA通道&#xff0c;又新增了另外一個通道&#xff0c;導致NVIC中&#xff0c;該通道的優先級為0&#xff0c;后來改成了5就正常了。