設計模式 - 單例模式 - Tips

為什么雙重檢查會帶來空指針異常問題?

if (instance == null) {             synchronized (Singleton.class) {                                 if (instance == null) {                     instance = new Singleton();                 }             }         
}

instance = new Singleton();

上述加粗的代碼并不是原子操作,包含三個步驟:

  1. 為 Singleton 分配內存地址

  2. 執行 Singleton() 構造方法,初始化成員變量等

  3. 將內存地址賦值給 instance 變量

假設線程 A 正在執行:

instance = new Singleton();   

由于指令重排序,線程 A 可能在構造函數執行之前,就已經將內存地址賦值給 instance,導致 instance 變為非 null。此時線程 B 會認為 instance 已經是合法對象,于是直接使用,結果可能:

  • 訪問尚未初始化的字段

  • 拋出 NullPointerException

  • 出現邏輯錯誤或不可預知的行為

為什么可以通過靜態內部類實現懶漢式單例模式

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

這依賴于 Java 類加載機制的特性:

  • JVM 在加載外部類的過程中不會加載靜態內部類,只有內部類的屬性 / 方法被調用時才會進行加載(懶漢式

  • JVM 在加載類的時候會自動保證線程安全,一個類在 JVM 中只會被加載一次

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

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

相關文章

【Ragflow】22.RagflowPlus(v0.3.0):用戶會話管理/文件類型拓展/諸多優化更新

概述 在歷經三周的階段性開發后,RagflowPlus順利完成既定計劃,正式發布v0.3.0版本。 開源地址:https://github.com/zstar1003/ragflow-plus 新功能 1. 用戶會話管理 在后臺管理系統中,新增用戶會話管理菜單。在此菜單中&…

c++重要知識點匯總(不定期更新)

前言 真心希望各位dalao點贊收藏~ 樹狀數組 作用:高效求出區間前綴和,允許進行修改操作。 舉個栗子: 剛開始有8項,分別為1-8。 首先構建二叉樹: 1-8/ |/ |/ |/ |/ |1-4 5-8/ | / |/ | / |1-…

Predict Podcast Listening Time-(回歸+特征工程+xgb)

Predict Podcast Listening Time 題意: 給你沒個播客的信息,讓你預測觀眾的聆聽時間。 數據處理: 1.構造新特征收聽效率進行分組 2.對數據異常處理 3.對時間情緒等進行數值編碼 4.求某特征值求多項式特征 5.生成特征組合 6.交叉驗證并enc…

Class類的詳細說明

Class類的詳細說明 Class 類是Java反射機制的核心,每個Java類或接口在JVM中都有一個對應的 Class 對象,用于表示該類的元數據(如類名、方法、字段、構造器等)。以下是其核心知識點: 1. 獲取Class對象的三種方式 方式…

[逆向工程]C++實現DLL注入:原理、實現與防御全解析(二十五)

[逆向工程]C實現DLL注入:原理、實現與防御全解析(二十五) 引言 DLL注入(DLL Injection)是Windows系統下實現進程間通信、功能擴展、監控調試的核心技術之一。本文將從原理分析、代碼實現、實戰調試到防御方案&#x…

【ROS2實戰】在中國地區 Ubuntu 22.04 上安裝 ROS 2 Humble 教程

本文介紹如何在中國大陸環境下順利安裝 ROS 2 Humble,包括使用清華鏡像源、解決 locale 和 GPG 密鑰問題、安裝 ROS 軟件包以及配置自動環境加載。 🌟 ROS 2 版本簡介 ROS 2 是機器人操作系統的第二代版本,目前主要有兩個長期支持&#xff0…

嵌入式學習筆記 - STM32 ADC 模塊工作模式總結

ADC 模式總結: 一 單ADC模式(是指ADC1,ADC2,ADC3中只有一個ADC被使用) ①單通道: 非連續模式:非連續的意思就是單次,一次轉換完成后就停止轉換,除非再次被軟件或者被外部觸發啟動&#xff1b…

Python訓練打卡Day26

函數專題1:函數定義與參數 知識點回顧: 函數的定義變量作用域:局部變量和全局變量函數的參數類型:位置參數、默認參數、不定參數傳遞參數的手段:關鍵詞參數傳遞參數的順序:同時出現三種參數類型時 到目前為…

使用Docker部署Nacos

sudo systemctl start docker sudo systemctl enable docker docker --version 步驟 2: 拉取 Nacos Docker 鏡像 拉取 Nacos 鏡像: 你可以從 Docker Hub 上拉取官方的 Nacos 鏡像,使用以下命令: docker pull nacos/nacos-server 這會從 …

Ubuntu 添加系統調用

實驗內容 通過內核編譯法添加一個不用傳遞參數的系統調用,其功能可自定義。 (1)添加系統調用號,系統會根據這個號找到syscall_table中的相應表項。具體做法是在syscall_64.tbl文件中添加系統調用號和調用函數的對應關系。 &#…

Javascript:WebAPI

獲取網頁元素 queryselector queryselector是 JavaScript 中用于選擇 DOM 元素的重要方法,它允許使用 CSS 選擇器語法來查找頁面中的元素。 一般queryselector獲取的元素都是html中第一個選擇器的元素 支持選擇器類型:類選擇器(.class) &#xff0c…

十二、Hive 函數

作者:IvanCodes 日期:2025年5月1日 專欄:Hive教程 在數據處理的廣闊天地中,我們常常需要對數據進行轉換、計算、清洗或提取特定信息。Hive 提供了強大的內置運算符和豐富的內置函數庫,它們就像魔法師手中的魔法棒&…

Linux之Nginx安裝及配置原理篇(一)

Nginx安裝及配置 前情回顧 首先針對Nginx進程模型,我們回顧一下它的原理機制,我們知道它是通過Master通過fork分發任務節點給予work節點,然后work節點觸發了event事件,之后通過一個access_muttex互斥鎖,來單線程調用我…

嵌入式培訓之數據結構學習(五)棧與隊列

一、棧 (一)棧的基本概念 1、棧的定義: 注:線性表中的棧在堆區(因為是malloc來的);系統中的棧區存儲局部變量、函數形參、函數返回值地址。 2、棧頂和棧底: 允許插入和刪除的一端…

深度學習---知識蒸餾(Knowledge Distillation, KD)

一、知識蒸餾的本質與起源 定義: 知識蒸餾是一種模型壓縮與遷移技術,通過將復雜高性能的教師模型(Teacher Model)所學的“知識”遷移到輕量級的學生模型(Student Model),使學生模型在參數量和計…

ARP Detection MAC-Address Static

一、ARP Detection(ARP檢測) ? 定義: ARP檢測是一種防止ARP欺騙攻擊的安全機制。它通過監控或驗證網絡中的ARP報文,來判斷是否存在偽造的ARP信息。 🔍 工作原理: 網絡設備(如交換機&#xf…

基于 Python 的界面程序復現:標準干涉槽型設計計算及仿真

基于 Python 的界面程序復現:標準干涉槽型設計計算及仿真 在工業設計與制造領域,刀具的設計與優化是提高生產效率和產品質量的關鍵環節之一。本文將介紹如何使用 Python 復現一個用于標準干涉槽型設計計算及仿真的界面程序,旨在幫助工程師和…

Python繪制南丁格爾玫瑰圖:從入門到實戰

Python繪制南丁格爾玫瑰圖:從入門到實戰 引言 南丁格爾玫瑰圖(Nightingale Rose Chart),也被稱為極區圖(Polar Area Chart),是一種獨特的數據可視化方式。這種圖表由弗洛倫斯南丁格爾&#xff…

計算機操作系統概要

不謀萬世者,不?謀?時。不謀全局者 ,足謀?域 。 ——陳澹然《寤?》《遷都建藩議》 操作系統 一.對文件簡單操作的常用基礎指令 ls ls 選項 目錄或?件名:羅列當前?錄下的?件 -l:以長格式顯示?件和?錄的詳細信息 -a 或 --all&…

<PLC><視覺><機器人>基于海康威視視覺檢測和UR機械臂,如何實現N點標定?

前言 本系列是關于PLC相關的博文,包括PLC編程、PLC與上位機通訊、PLC與下位驅動、儀器儀表等通訊、PLC指令解析等相關內容。 PLC品牌包括但不限于西門子、三菱等國外品牌,匯川、信捷等國內品牌。 除了PLC為主要內容外,相關設備如觸摸屏(HMI)、交換機等工控產品,如果有…