java 設計模式(三)-- 單例模式

引言

單例模式是一種常用的軟件設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取這個實例。單例模式在Java中實現起來相對簡單,但實現方式有多種,每種方式都有其特點和適用場景。

一、單例模式的實現方式

1. 懶漢式(線程不安全):

這是最基本的單例實現方式,它在第一次調用getInstance()方法時才會創建實例。

public class Singleton {private static Singleton instance;// 私有化構造函數private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

這種方式的缺點是,如果多個線程同時訪問getInstance()方法,可能會創建多個實例。

2. 懶漢式(線程安全):

通過在方法上加鎖來保證線程安全。

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

但這種方式的缺點是,每次調用getInstance()方法時都需要同步,這會影響性能。

3. 餓漢式:

在類加載時就創建實例,避免了多線程同步問題。

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

這種方式簡單,不存在多線程同步問題,但不管是否使用該實例,類裝載時就完成實例化。

4. 雙重檢查鎖定(Double-Checked Locking)推薦

結合了懶漢式和餓漢式的優點,既保證了線程安全,又避免了同步帶來的性能問題

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;}
}

volatile關鍵字確保了多線程環境下instance變量的可見性。

5. 靜態內部類:

靜態內部類實現方式同樣利用了類加載的機制來保證初始化instance時只有一個線程,同時利用了JVM的類加載機制來保證初始化instance時線程安全。

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

二、單例模式的應用場景

單例模式廣泛應用于各種 Java 應用程序中,以下是一些典型的應用場景:

  • 日志記錄器:通常系統中只需要一個日志記錄器實例,用于集中管理日志信息。
  • 配置管理:應用程序的配置信息通常應該由單個實例管理,以確保配置的一致性。
  • 緩存:緩存數據的共享訪問可以使用單例模式實現。
  • 線程池:線程池通常由單例管理,以控制線程的生命周期和資源分配。
  • 數據庫連接池:數據庫連接池也是典型的單例模式應用,用于管理數據庫連接資源。
  • 對話框:GUI 應用程序中的對話框通常應該是單例的,以避免創建多個對話框實例。
  • 注冊中心:服務注冊中心通常使用單例模式來保證全局唯一性。

可以看到,單例模式是一種非常實用和廣泛應用的設計模式。合理使用單例模式可以幫助我們更好地管理應用程序的資源和狀態,提高程序的性能和可靠性。

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

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

相關文章

【Linux】從零開始認識進程間通信 —— 管道

送給大家一句話: 人要成長,必有原因,背后的努力與積累一定數倍于普通人。所以,關鍵還在于自己。 – 楊絳 從零開始認識進程間通信 1 為什么要進程間通信2 進程如何通信3 進程通信的常見方式4 管道4.1 什么是管道4.2 管道通信的系…

交叉編譯程序,提示 incomplete type “struct sigaction“ is not allowed

問題描述 incomplete type "struct sigaction" is not allowed解決辦法 在代碼的最頂端添加如下代碼即可 #define _XOPEN_SOURCE此定義不是簡單的宏定義,是使程序符合系統環境的不可缺少的部分 _XOPEN_SOURCE為了實現XPG:The X/Open Porta…

零一萬物Yi-1.5開源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年來,大型語言模型(LLM)在各個領域展現出驚人的能力,為人們的生活和工作帶來了巨大的改變。然而,大多數開源 LLM 的性能仍然無法與閉源模型相媲美,這限制了 LLM 在科研和商業領域的進一步應用。為了…

element-plus表格的表單校驗如何實現,重點在model和prop

文章目錄 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重點&#xff1a; 1) tableData放到form對象里 2) form-item的prop要寫成tableData.序號.屬性 <!--table-表單校驗--> <template><el-form ref"forms" :model"form"><e…

leetcode 207.課程表

思路&#xff1a;拓補排序 數據結構中的知識&#xff0c;這道題其實本質上就是判斷在課程表的這個有向圖當中是否有環存在&#xff0c;如果有環&#xff0c;說明不能學完&#xff1b;沒有環說明可以。判斷有無環的做法是拓補排序最好解決。 下面就是拓補排序的做法了&#xf…

安裝mpi4py與dlio_profiler_py的總結

安裝mpi4py mpi4py是一個Python庫&#xff0c;它提供了與MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能夠利用MPI實現并行計算。mpi4py 的核心是基于MPI標準的C/C實現&#xff0c;它能夠在高性能計算環境下進行高效的并行處理…

軟考之信息系統管理知識點(3)

流水線&#xff1a;是指在程序執行時多條指令重疊進行操作的一種準并行處理實現技術。各種部件同時處理是針對不同指令而言的&#xff0c;它們可同時為多條指令的不同部分進行工作&#xff0c;以提高各部件的利用率和指令的平均執行速度。 編譯得過程 關系數據庫是表的集合 …

【全網最全】2024電工杯數學建模A題前兩問完整解答+21頁初步參考論文+py代碼+保獎思路等(后續會更新成品論文)

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

力扣:92. 反轉鏈表 II(Java)

目錄 題目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代碼實現&#xff1a; 題目描述&#xff1a; 給你單鏈表的頭指針 head 和兩個整數 left 和 right &#xff0c;其中 left < right 。請你反轉從位置 left 到位置 right 的鏈表節點&#xff0c;返回 反轉后的…

Springboot 開發 -- 創建Spring Boot Starter

一、簡介 Spring Boot Starter是Spring Boot生態中非常重要的一部分&#xff0c;它允許開發者通過簡單的依賴管理來快速集成各種功能和庫。在開發過程中&#xff0c;我們經常會遇到一些通用的功能或配置&#xff0c;如果每次都需要手動添加這些配置和依賴&#xff0c;那么將會…

網絡采集受限?如何解決指紋識別、IP封禁、驗證碼、賬號多登等問題

網頁采集是什么 網頁采集&#xff0c;也常被稱作網絡采集、網絡數據抓取&#xff0c;是一種通過自動化工具從網站上獲取信息的技術。這些技術通過訪問網頁&#xff0c;解析頁面上的內容&#xff0c;并提取出有價值的數據&#xff0c;如文本、圖片、鏈接等。 網頁采集通常用于…

Leedcode34. 在排序數組中查找元素的第一個和最后一個位置_Java解法

Problem: 34. 在排序數組中查找元素的第一個和最后一個位置 題目描述思路解題方法復雜度Code 題目描述 34. 在排序數組中查找元素的第一個和最后一個位置 力扣鏈接 給定一個按照升序排列的整數數組 nums&#xff0c;和一個目標值 target。找出給定目標值在數組中的開始位置…

Python 調整PDF文件的頁面大小

在處理PDF文件時&#xff0c;我們可能會遇到這樣的情況&#xff1a;原始PDF文檔不符合我們的閱讀習慣&#xff0c;或者需要適配不同顯示設備等。這時&#xff0c;我們就需要及時調整PDF文檔中的頁面尺寸&#xff0c;以滿足不同應用場景的需求。 利用Python語言的高效性和靈活性…

Linux--網絡通信(一)概述

網絡通信概述 網絡通信本質上是一種進程間通信&#xff0c;是位于網絡中不同主機上的進程之間的通信&#xff0c;屬于 IPC 的一種&#xff0c; 通常稱為 socket IPC。所以網絡通信是為了解決在網絡環境中&#xff0c;不同主機上的應用程序之間的通信問題。 大概可以分為三個層…

優化關聯查詢

三個表的創建語句 CREATE TABLE test.afx_output_source_item (cheadguid INT NOT NULL,goodsid INT NULL,goodsno VARCHAR(45) NULL,goodsname VARCHAR(45) NULL,model VARCHAR(45) NULL,goodstaxno VARCHAR(45) NULL,PRIMARY KEY (cheadguid));CREATE TABLE test.afx_output…

23種設計模式之一————外觀模式詳細介紹與講解

外觀模式詳細講解 一、概念二、 外觀模式結構核心思想及解釋模式的UML類圖模式角色應用場景模式優點模式缺點 三、實例演示圖示代碼展示運行結果 一、概念 外觀模式&#xff08;Facade Pattern&#xff09;是一種結構型設計模式&#xff0c;它提供了一個統一的接口&#xff0c…

【問題解決】Android Studio Jellyfish新建Kotlin項目后Gradle Sync及Maven下載很慢

創建新項目之后&#xff0c;Gradle Sync和Build都很慢&#xff0c;因為下載Gradle和Maven等工具。 代碼默認配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

ASSM是Automatic Segment Space Management(自動段空間管理)解析

ASSM是Automatic Segment Space Management&#xff08;自動段空間管理&#xff09;的縮寫&#xff0c;是Oracle數據庫引入的一項重要特性&#xff0c;首次出現在Oracle 9i中。ASSM旨在簡化空間管理和提高數據庫性能&#xff0c;特別是對于表和索引段的空間分配和回收過程。 在…

Android Activity 設計詳解

文章目錄 Android Activity 設計說明1. Activity 的生命周期2. Activity 的啟動模式3. Activity 的通信4. Activity 的布局和視圖管理5. Activity 的配置變化處理6. Activity 的保存和恢復狀態7. Activity 的任務和返回棧 總結 Android Activity 設計說明 在 Android 中&#…

Ansible01-Ansible的概述、實驗環境初始化、Inventory

目錄 寫在前面1. Ansible是什么1.1 簡介與來歷1.2 Ansible的特點1.3Ansible的架構與工作流程1.3.1 ansible 任務執行模式1.3.2 ansible 執行流程1.4 Ansible的模塊 2. Ansible實驗初始化2.1 實驗環境2.2Ansible的安裝2.2.1 Ansible的程序結構 2.3 修改Ansible配置文件2.3.1 配置…