java 設計模式之單例模式

簡介

單例模式:一個類有且僅有一個實例,該類負責創建自己的對象,同時確保只有一個對象被創建。

特點:類構造器私有、持有自己實例、對外提供獲取實例的靜態方法。

單例模式的實現方式

餓漢式

類被加載時,就會實例化一個對象并交給自己的引用,供系統使用;而且,由于這個類在整個生命周期中只會被加載一次,因此只會創建一個實例,即能夠充分保證單例。

案例:

public class Singleton {private static Singleton instance = new Singleton();private Singleton() { }public static Singleton getInstance() {return instance;}
}

餓漢式比較耗費資源,因為它創建單例的時間過早,它是在類被加載的時候創建單例的

懶漢式加雙重檢查加鎖

餓漢式的優化,只有在獲取類的實例時才會創建實例。

案例:

public class SingleTon {// 使用volatile修飾,保證變量的可見性private static volatile SingleTon instance;public static SingleTon getInstance() {// 先檢查實例是否存在,如果不存在才進入下面的同步塊if (instance == null) {// 同步塊,線程安全的創建實例synchronized (SingleTon.class) {// 再次檢查實例是否存在,如果不存在才真的創建實例if (instance == null) {instance = new SingleTon();}}}return instance;}
}

餓漢式中的注意事項:

1、為什么類持有的自己的私有實例要用volatile修飾:為了保證指定變量的有序性和可見性。new一個對象的代碼 SingleTon instance = new SingleTon(); 可以分解為3行偽代碼:

memory=allocate();// 分配內存 相當于c的malloc
ctorInstanc(memory) //初始化對象
instance=memory //設置instance指向剛分配的地址

上面的代碼在編譯器運行時,可能出現重排序,從 1-2-3 變為 1-3-2,在多線程環境下就會出現問題,使用 volatile 關鍵字會禁止這種重排序。

2、為什么要雙重鎖:如果只有一個鎖,很有可能兩個線程都通過了 if(instance == null) 的判斷,所以在進入同步代碼塊之后還需要再判斷一次

用靜態內部類來實現單例模式

案例:

public class SingleTon {private SingleTon2() { }// 用一個私有的靜態內部類來存儲外部類的實例,類只會被加載一次,保證單例。// 內部類只有在被調用時才會被加載,保證了延遲加載private static class SingleTonHolder {private static SingleTon2 instance = new SingleTon2();}public static SingleTon2 getInstance() {return SingleTonHolder.instance;}
}

破壞單例模式

破壞單例模式:序列化和反射可以破壞單例模式。

  • 解決序列化破壞單例的問題:在類中添加readResolve方法,返回類中的實例,可以解決通過序列化破壞單例模式的問題;
  • 解決反射破壞單例的問題:在構造方法中拋異常,可以解決通過反射破壞單例模式的問題

單例模式的使用案例

餓漢式單例模式的使用:jdk中的Runtime類,每個java程序中都只有一個Runtime實例,它代表java程序的運行環境

public class Runtime {// 類被加載時,就會實例化一個對象并交給自己的引用private static Runtime currentRuntime = new Runtime();// 返回單例對象的方法public static Runtime getRuntime() {return currentRuntime;}// 私有化的構造方法/** Don't let anyone else instantiate this class */private Runtime() {}
}

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

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

相關文章

Milvus 索引如何選擇

以下是幾種索引類型的特點及適用場景,可據此選擇: AUTOINDEX 特點:數據庫自動選擇合適索引類型,無需深入了解索引細節。適用場景:對索引知識了解有限,或不確定哪種索引適合當前數據和查詢需求&#xff0c…

CentOS 7 安裝教程

準備: 軟件:VMware Workstation 鏡像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程較為詳細,注釋較多,故將操作的選項進行了加粗字體顯示。) 1、文件–新建虛擬機–自定義 2、硬盤…

TAS啟動與卸載

3. 啟動TAS(Thin-Agent服務) TAS在安裝完成后通常會自動啟動,并在系統重啟時自啟。如需手動啟動,請按以下步驟操作:  3.1 在Windows上啟動TAS 1. 打開 Windows服務管理器: ? 按下 Win R&…

Redis面試——數據結構

一、SDS如何防止緩沖區溢出? Redis 的 String 類型通過 SDS(Simple Dynamic String)來防止緩沖區溢出,具體機制如下: Redis 的 String 類型底層采用 SDS 實現,即 Simple Dynamic StringSDS 底層維護的數據…

Doris的向量化執行如何支撐分布式架構和復雜查詢

Doris 的向量化執行能力與其 分布式架構 和 復雜查詢優化 深度結合,通過 批處理 列式計算 分布式調度 的協同設計,解決傳統分布式數據庫在復雜查詢場景下的性能瓶頸。以下是具體原理展開: 一、向量化如何適配分布式架構? Doris…

DataInputStream 終極解析與記憶指南

DataInputStream 終極解析與記憶指南 一、核心本質 DataInputStream 是 Java 提供的數據字節輸入流,繼承自 FilterInputStream,用于讀取基本數據類型和字符串的二進制數據。 作用:1.專門用來讀取使用DataOutputStream流寫入的文件 注意:讀取的順序要和寫入的順序一致(…

云轉型(cloud transformation)——不僅僅是簡單的基礎設施遷移

李升偉 編譯 云轉型不僅僅是遷移基礎設施,更是重塑企業運營、創新及價值交付的方式。它具有戰略性、持續性,并影響著人員、流程和平臺。 ?? 云轉型涉及以下內容: 🔄 應用現代化——從單體架構轉向微服務架構。 ?? 運營自動…

Java HTTP Client API詳解

Java HTTP Client API詳解 Java的HTTP客戶端API經歷了多次演進,從早期的HttpURLConnection到第三方庫如Apache HttpClient,再到Java 11引入的標準HttpClient。本文將全面解析Java中主要的HTTP客戶端API,包括特性對比、使用方法和最佳實踐。 …

如何深入理解引用監視器,安全標識以及訪問控制模型與資產安全之間的關系

一、核心概念總結 安全標識(策略決策的 “信息載體) 是主體(如用戶、進程)和客體(如文件、數據庫、設備)的安全屬性,用于標記其安全等級、權限、訪問能力或受保護級別,即用于標識其安全等級、權限范圍或約束…

京東3D空間視頻生成技術探索與應用

1. 背景 近年來,隨著社交媒體、流媒體平臺以及XR設備的快速發展,沉浸式3D空間視頻的需求迅猛增長,尤其是在短視頻、直播和電影領域,正在重新定義觀眾的觀看體驗。2023年,蘋果公司發布的空間視頻技術為這一趨勢注入了新…

驚爆!Cursor 限制多設備登錄,網友瘋狂吐槽,退訂潮洶涌來襲,直呼:沒理由再給它掏錢!

大家好,我是小程程。 吃瓜吃瓜,知名 AI 編程工具 Cursor 惹事了! ① 遭遇強制登出 前幾天有 Cursor 用戶發現,自己要是從多臺設備登錄,就會被強制下線。 比方說,你正在臺式電腦上干活,中途換到筆…

React JSX 語法深度解析與最佳實踐

本文系統梳理 JSX 語法的完整知識體系。通過原理剖析、代碼示例和開發警示&#xff0c;幫助開發者建立嚴謹的 JSX 使用認知。 一、JSX 本質解析 1.1 編譯機制 JSX 通過 Babel 轉換為 React.createElement 調用&#xff0c;以下為轉換對照&#xff1a; // 原始 JSX <MyCo…

若依改用EasyCaptcha驗證碼

若依自帶的驗證碼樣式比較單一&#xff0c;所以想改用EasyCaptcha驗證碼&#xff0c;另外EasyCaptcha算術驗證碼可能會有負數&#xff0c;輸入時需要寫負號&#xff0c;比較麻煩&#xff0c;所以使用一個簡單的方法過濾掉負數結果 原本的驗證碼依賴和代碼可刪可不刪&#xff0c…

趣味編程之go與rust的愛恨情仇

聲明:此篇文章利用deepseek生成。 第一章&#xff1a;出身之謎 Go&#xff08;江湖人稱"高小戈"&#xff09;是名門之后——谷歌家的三少爺。生來就帶著"簡單粗暴"的家族基因&#xff0c;口號是**“少寫代碼多搬磚&#xff0c;并發處理賽神仙”**。它爹Ro…

【cocos creator 3.x】速通3d模型導入, 模型創建,陰影,材質使用,模型貼圖綁定

1、右鍵創建平面&#xff0c;立方體 2、點擊場景根節點&#xff0c;shadows勾選enabled3、點擊燈光&#xff0c;shadow enabled勾選 4、點擊模型&#xff0c;勾選接收陰影&#xff0c;投射陰影&#xff08;按照需要勾選&#xff09; 5、材質創建 6、選中節點&#xff0c;找…

告別昂貴語音合成服務!用GPT-SoVITS生成你的個性化AI語音

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天給大家介紹一款AI語音克隆工具——GPT-SoVITS。這款由花兒不哭大佬開發的工具是一款強大的訓練聲音模型與音頻生成工具…

Doris FE 常見問題與處理指南

在數據倉庫領域&#xff0c;Apache Doris 憑借其卓越性能與便捷性被廣泛應用。其中&#xff0c;FE&#xff08;Frontend&#xff09;作為核心組件&#xff0c;承擔著接收查詢請求、管理元數據等關鍵任務。然而&#xff0c;在實際使用中&#xff0c;FE 難免會遭遇各類問題&#…

Unity編輯器擴展之項目資源查找工具

一、需要實現的效果如下: 二、在項目的Asset目錄下新增Editor目錄,新增AssetSearchWindow和EditorDefine和EditorTools這三個C#腳本,并復制以下的代碼保存好之后,就可以實現上述功能啦。 -------------------------------------------EditorTools腳本Begin----------------…

《Java 泛型的作用與常見用法詳解》

大家好呀&#xff01;&#x1f44b; 今天我們要聊的是Java中一個超級重要但又讓很多初學者頭疼的概念——泛型(Generics)。帶你徹底搞懂它&#xff01;&#x1f4aa; 準備好你的小本本&#xff0c;我們開始啦&#xff5e;&#x1f4dd; 一、為什么需要泛型&#xff1f;&#x…

USB(TYPE-C)轉串口(TTL)模塊設計講解

目錄 一 、引言 二、方案設計 三、USB TYPE-C介紹 1、TYPE-C接口定義 1、24P全引腳描述 2、Type C 接口 VBUS/GND 作用 3、Type C 接口 D/D- 作用 1、數據傳輸&#xff1a; 2、設備識別&#xff1a; 3、充電協議協商&#xff1a; 4、Type C 接口 CC1/CC2 作用 1、主從設備區…