【Java_EE】設計模式

設計模式:解決一些固定場景的固定套路,是一種代碼風格的知道指南。設計模式不止23種

1、單例設計模式

單例設計模式:確保一個類只有一個實例,提供全局訪問點

單例模式的實現方式:

1:餓漢模式

/*** 餓漢模式*/
class SingletonPattern {private static SingletonPattern instance = new SingletonPattern();private SingletonPattern () {// 設置為private,外部類就不能通過new創建實例}public static SingletonPattern getInstance() {return instance;}
}public class SinglePattern {public static void main(String[] args) {SingletonPattern instance1 = SingletonPattern.getInstance();SingletonPattern instance2 = SingletonPattern.getInstance();System.out.println(instance1 == instance2); // true}
}

2:懶漢模式

懶漢模式(線程不安全)

此處的代碼是存在線程安全問題的。

1:原子性

應該將此處代碼打包成原子的,不讓代碼穿插操作。所以就對代碼進行加鎖,解決原子性問題

if(instance == null) {
? ? ? ? ? ? instance = new SingleLazy();
? ? ? ? }

2:指令重排序

instance = new SingleLazy(); 此處這個new操作實際有好幾步指令,粗略分為下面三步

1:內存分配

2:初始化零值

3:執行構造函數

實際的執行順序是1-》2-》3,但是編譯器優化的指令重排序,可能會將原本執行順序重排為1-》3-》2,所以為了避免指令重排序,需要在instance上加上volatile

class SingleLazy {/*** 單例模式* 懶漢模式:創建實例的時機比較晚,不是那么急迫*/private static SingleLazy instance = null;private SingleLazy() {}// 第一次使用實例的時候,才創建實例public static SingleLazy getInstance() {if(instance == null) {// return new SingleLazy(); // 這樣寫是錯的,這樣每次get都會newinstance = new SingleLazy();}return instance;} 
}
public class SingleLazyPattern {public static void main(String[] args) {SingleLazy instance1 = SingleLazy.getInstance();SingleLazy instance2 = SingleLazy.getInstance();System.out.println(instance1 == instance2); // true}
}

?懶漢模式(線程安全)

又在鎖的外面加了一條判斷,目的就是只在第一次調用getInstance方法是進行加鎖,避免重復加鎖

if(instance == null)?
// 如果不進行判斷,那么每次調用getInstance方法都會進行加鎖操作
// 但是如果加了判斷,只會在第一次調用getInstance方法進行加鎖操作
?

class SinglePattern {private static volatile SinglePattern instance = null; // volatile解決指令重排序問題private static Object lock = new Object();private SinglePattern() {// 避免外部創建實例}public static SinglePattern getInstance() {if(instance == null) {// 如果不進行判斷,那么每次調用getInstance方法都會進行加鎖操作// 但是如果加了判斷,只會在第一次調用getInstance方法進行加鎖操作synchronized(lock) { // 加鎖,解決原子性問題if(instance == null) {instance = new SinglePattern();}}}return instance;}
}public class SingleLazyPattern {public static void main(String[] args) {SinglePattern instance1 = SinglePattern.getInstance();SinglePattern instance2 = SinglePattern.getInstance();System.out.println(instance1 == instance2);}}

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

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

相關文章

Nginx代理緩存靜態資源

問題描述 有兩臺服務器,一臺是外網的網關服務器,一臺是內網的資源服務器,但是兩臺服務器距離很遠(跨省),頁面中依賴大量插件資源,加載耗時久,本章重點講解Nginx代理緩存靜態資源。 …

Blender 轉換為 STP:軟件操作與迪威模型網在線轉換全指南

在三維設計與工程制造領域,不同格式的文件承擔著各自的使命。Blender 作為一款功能強大且開源的三維建模軟件,被眾多設計師、藝術家以及學生廣泛使用,能夠創作出風格多樣、細節豐富的三維模型。而 STP 格式作為制造業通用的數據交換標準&…

WebFuture:PDF頁面去掉下載按鈕

問題描述:客戶要求pdf頁面不顯示下載按鈕 解決辦法:WF15.2版本開始會在內容管理配置增加“允許下載 PDF“開關;之前的版本需要替換文件來處理 1.備份網站下的base文件夾,路徑為/wwwroot/content/_common/base/,然后覆…

【JVM】- 類加載與字節碼結構2

編譯期處理(語法糖) java編譯器把.java源碼編譯成.class字節碼的過程,自動生成和轉換的一些代碼。 默認構造器 public class Candy01 { }編譯成class后的代碼 public class Candy1 {public Candy1(){super();} }自動拆裝箱(jd…

WSL2 中安裝 cuDNN?? 的完整指南

以下是關于 ??cuDNN?? 的詳細介紹及在 ??WSL2 中安裝 cuDNN?? 的完整指南,結合權威資料整理而成: 📚 ??一、cuDNN 深度解析?? ??1. 定義與作用?? ??cuDNN??(CUDA Deep Neural Network Library)是…

Apache Doris FE 問題排查與故障分析全景指南

前言: FE(Frontend)是 Apache Doris 集群架構中的“大腦”,負責元數據管理、查詢解析和調度等關鍵任務。一旦 FE 出現問題,整個集群的穩定性和可用性將受到嚴重影響。因此,掌握 FE 故障定位與排查方法對于保…

RK AndroidFramework 內置應用可,卸載,恢復出廠設置恢復安裝

device/rockchip/rk356x/rk3568_r/preinstall_del/Android.mkdevice/rockchip/rk356x/rk3568_r/preinstall_del/Android.mk include $(call all-subdir-makefiles) 拿內置LoyversePos應用做例子 device/rockchip/rk356x/rk3568_r/preinstall_del/preinstall.mk PRODUCT_PACK…

一文了解Blob文件格式,前端必備技能之一

文章目錄 前言一、什么是Blob?二、Blob的基本特性三、Blob的構造函數四、常見使用場景1. 文件下載2. 圖片預覽3. 大文件分片上傳 四、Blob與其他API的關系1. File API2. FileReader3. URL.createObjectURL()4. Response 五、性能與內存管理六、實際案例:…

LLMs 系列實操科普(4)

六、deep research 這是 chatgpt 推出的功能,但我這里是免費用戶,一個月才有 5 次使用機會,而且使用的是輕量化模型版本,相對體驗上比較雞肋一些。 那這個深度思考研究是個什么東西呢? 根據 openai 對其的解釋是&…

若依框架前端調用后臺服務報跨域錯誤

背景:使用若依框架的前后端分離項目,前后端開發在同一個辦公室情況下前端調用后端服務提示如下報錯:Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源碼:構建高效電商平臺的利器

一、PHP商城源碼的核心優勢 1. **開源免費,降低成本** PHP作為開源語言,擁有龐大的開發者社區,成熟的商城源碼(如EcShop、OpenCart)可免費獲取,大幅降低企業的技術投入成本。 2. **開發效率高** PHP語法…

【學習筆記】C++代碼規范整理

【學習筆記】C代碼規范整理 一、匿名空間namespace 匿名命名空間(Anonymous Namespace)是一種特殊的命名空間聲明方式,其作用是將聲明的成員限定在當前編譯單元(源文件)內可見,類似于使用 static 關鍵字修…

數學復習筆記 29 不定積分

前言 復習的時候時常復習一下以前復習的高數,溫故而知新,可以為師矣。現實生活中有非常多讓我難受的事情,賢者模式的時候也會對一些自己的行為嗤之以鼻,復習考研對其他三門科目都沒有學出來正反饋,只能從數學這兒找一…

微軟因安全漏洞禁用黑暗環境下的Windows Hello面部識別功能

面部識別技術在各種場景中的應用日益廣泛,但身份欺詐事件仍時有發生,這表明即使面部識別也并非萬無一失。在某些情況下,這些系統可能被攻擊者利用。 漏洞發現與應對措施 近期,微軟在Windows 10和11系統中禁用了黑暗環境下使用Wi…

產品經理課程(十五)實戰點評(3)

(一)復習 需求文檔是產品的說明書 需求文檔包含:修訂記錄、背景、主要流程、詳細功能邏輯、數據上報,發布策略 bug也是需求文檔的一部分 (二)案例講解 案例一: 一個版本里面的4-5個功能點就比…

大模型量化與剪枝

大模型量化,剪枝 量化有助于減少顯存使用并加速推理 GPTQ 等后訓練量化方法(Post Training Quantization)是一種在訓練后對預訓練模型進行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 數據庫數據操作:精通 INSERT, UPDATE, DELETE

作者:IvanCodes 日期:2025年6月18日 專欄:Oracle教程 在 Oracle 數據庫中,對表內數據進行增加、修改和刪除操作是通過數據操作語言 (DML - Data Manipulation Language) 來完成的。核心的DML語句包括 INSERT (插入新數據), UPDATE…

推薦使用的Unity插件(InputSystem)

本文將提供更簡潔的步驟和常見問題解決。 一、極簡入門步驟: 安裝:Package Manager中安裝Input System(確保Unity版本在2019.4) 創建Input Actions: 在Project窗口右鍵 -> Create -> Input Actions 雙擊打開…

清理 Docker 容器日志文件方法

操作總結與問題解析 一、操作目的與背景 用戶旨在清理 Docker 容器日志文件以釋放服務器存儲空間,主要通過以下命令組合完成操作: 查看容器日志空間占用清空指定容器的日志文件驗證容器運行狀態與日志清理效果二、關鍵命令與輸出解析 1. 查看 Docker 容器日志空間占用 du…

圖片壓縮工具 | 按指定高度垂直切割圖片

OPEN-IMAGE-TINY,一個基于 Electron VUE3 的圖片壓縮工具,項目開源地址:https://github.com/0604hx/open-image-tiny ?? 需求描述 在上一篇文章一段代碼利用 snapdom 將 CSDN 博文轉化為長圖片(PNG/JPG/PDF)中&…