JavaEE之線程(7)_單例模式(設計模式概念、單例模式優點、懶漢、餓漢模式)

一、什么是設計模式?

單例模式是設計模式中較為常見的一種。那么,什么是單例模式?

  1. 設計模式(Design Pattern)都是一些相對優秀的解決方案,很多問題都是典型的、有代表性的問題,學習設計模式,我們就不用自己從頭來解決這些問題,相當于在巨人的肩膀上,復用這些方案即可。
  2. 設計模式已經成為專業人士的常用詞匯,不懂不利于交流。
  3. 能讓你設計的系統更加專業,讓系統有更好的架構。

目的:使用設計模式是為了可重用性代碼,讓代碼更容易被他人理解,保證代碼可靠性。


二、單例模式

基本概念:
?單例模式是一種設計模式,它的目的是保證一個類只有一個實例,并提供一個全局的訪問點。使用單例模式可以避免多次創建對象,節省內存空間,同時也可以保證數據的一致性。

約定某個類,只能有唯一個對象。通過編碼技巧,讓編譯器進行強制檢査,(在類里面提前把對象創建好,并且把構造方法設為 private)

2.1 單例模式的好處

  • [ 節省系統資源] :在系統中,如果有多個實例會造成資源浪費,而使用單例模式可以減少這種浪費。
  • [簡化了對象訪問] :單例模式提供了一個全局的訪問點,因此可以簡化訪問過程。

2.2 懶漢模式

懶漢式單例模式:

在第一次使用時才創建單例對象。缺點是需要考慮線程安全問題。
單線程版代碼實例:

//類加載的時候不創建實例. 第一次使用的時候才創建實例.
class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

?上述代碼懶漢模式的實現是線程不安全的

  1. 線程安全問題發生在首次創建實例時。如果在多個線程中同時調用 getInstance 方法,就可能導致創建出多個實例;
  2. 一旦實例已經創建好了, 后面再多線程環境調用 getInstance 就不再有線程安全問題了(不再修改instance 了)

懶漢模式-多線程版

加上 synchronized 可以改善這里的線程安全問題

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

懶漢模式-多線程版(改進版)

代碼在加鎖的基礎上, 做出了進一步改動:

  1. 使用雙重 if 判定, 降低鎖競爭的頻率.。
  2. 給 instance 加上了 volatile。
package single;/*** @author Zhang* @date 2024/5/717:12* @Description:*/class  SingletonLazy{private  static volatile  SingletonLazy instance = null;    //懶漢模式public  static SingletonLazy getInstance(){if(instance == null){//如果對象已經有了,線程就安全了,此時就可以不加鎖了//如果對象還沒有,存在在線程不安全的風險,就需要加鎖synchronized (SingletonLazy.class){  //一旦加鎖,就可能產生阻塞if (instance == null){   //判定是否要new一個對象instance = new SingletonLazy();}}}return instance;}private  SingletonLazy(){ }}public class Test2 {public static void main(String[] args) {}
}

注意理解上述代碼雙重 if 判定 / volatile:

  1. 理解雙重 if 判定 / volatile:加鎖 / 解鎖是一件開銷比較高的事情。 而懶漢模式的線程不安全只是發生在首次創建實例的時候,因此后續使用的時候, 不必再進行加鎖了。
  2. 外層的 if 就是判定下看當前是否已經把 instance 實例創建出來了。同時為了避免 “內存可見性” 導致讀取的 instance 出現偏差, 于是補充上 volatile。

2.3 餓漢模式

餓漢式單例模式:在類加載時創建單例對象。缺點是不支持延遲加載。

  1. 優點:單例只有在使用時才被實例化,一定程度上節約了資源 ;
  2. 缺點:加入synchronized關鍵字,造成不必要的同步開銷。不建議使用。
package single;/*** @author Zhang* @date 2024/5/716:58* @Description:*/class  Singleton{/*** 1. 在類的內部,提供一個現成的實例* 2. 把構造方法設置為private,避免其他代碼能夠創建出實例* 通過上述方式,就強制了其他程序員在使用這個類的時候,就不會創建出多個對象了*/private static  Singleton instance  = new Singleton();    //這里的創建時機,是在類加載的時候(比較早的時機)--餓漢模式//通過這個方法來獲取剛剛的實例//后續如果想使用這個類的實例,都通過getInstance() 方法來獲取public static Singleton getInstance(){return instance;}//把構造方法設置為私有,此時類外面的代碼,就無法new相互這個類的對象了private Singleton(){ }}public class Test1 {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2); //true}
}

2.4 單例模式的總結

?我們只介紹單例實現方式的餓漢模式、懶漢模式兩種方式,其他單例模式的內容可以通過網絡資源進行查閱。接下來讓我們總結一下不同單例模式的區別:
在這里插入圖片描述

總結

?以上就是今天要講的內容,本文僅僅簡單介紹了設計模式的概念,什么是單例模式?包括懶漢模式和餓漢模式,并寫出了相應的參考代碼。最后,對不同實現方式的單例模式進行了總結。

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

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

相關文章

C#面:如果出現ASP.NET中的事件不能觸發可能由于什么原因造成

當 ASP.NET 中的事件不能觸發時,可能由以下幾個原因造成: 事件綁定錯誤:請確保事件正確地綁定到相應的控件上。在 ASP.NET 中,可以通過在前端代碼或者后端代碼中使用事件處理程序來綁定事件。如果事件沒有正確地綁定到控件上&…

為什么本科畢業后我堅定地選擇了就業而不是考研?

大家好,我是小布丁。今天來聊聊我為什么本科畢業后選擇了就業而不是考研。 在整個大學期間,我被親戚拷問最多的問題就是:準備考研嗎?相信很多大學生都遇到過這種情況吧。 如果你說準備還好,親戚大概率就不會問下去&a…

js計算字符串大小存儲所占字節數

在JavaScript中,計算字符串所占的大小(占用的字節數)并不直接,但可以通過一些方法間接得到。 我們需要知道一個前提,英文字母 lenght 和字節數是一樣的:都是1,而中文 lenght1,字節數…

golang sqlite主從數據同步插件開發

### golang sqlite主從數據同步插件開發思路 參考Mysql的主從同步機制,Mysql是產生binlog,然后把binlog日志同步到從服務上。 同理,我們按sql執行順序記錄所有的增刪改查的sql語句,然后調用接口把sql語句傳到從服務上執行。 數…

關于軟件設計模式的理解

系列文章 關于時間復雜度o(1), o(n), o(logn), o(nlogn)的理解 關于HashMap的哈希碰撞、拉鏈法和key的哈希函數設計 關于JVM內存模型和堆內存模型的理解 關于代理模式的理解 關于Mysql基本概念的理解 關于軟件設計模式的理解 文章目錄 前言一、軟件設計模式遵循的六大原則…

前端面試題日常練-day35 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備,答案在文末。 1. 以下哪個是使用jQuery選擇所有具有CSS類名"myClass"的元素的正確語法? a) $(".myClass") b) $("myClass") c) $("#myClass") d) $("…

FURNet問題

1. 為什么選擇使用弱監督學習? 弱監督學習減少了對精確標注數據的依賴,這在醫學圖像處理中尤為重要,因為高質量標注數據通常需要大量專業知識和時間。弱監督學習通過利用少量標注數據或粗略標注數據來訓練模型,降低了數據準備的成…

元組推導式

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用元組推導式可以快速生成一個元組,它的表現形式和列表推導式類似,只是將列表推導式中的“[]”修改為“()”。例如&#xf…

python深入解析字符串操作的八大神技

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、字符串的長度與切片 示例代碼 二、去除多余的空格 示例代碼 三、字符串的開頭與包含…

元組的創建和刪除

目錄 使用賦值運算符直接創建元組 創建空元組 創建數值元組 刪除元組 自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元組(tuple)是Python中另一個重要的序列結構&#…

JavaScript 獲取 HTML 中特定父元素下的子元素

JavaScript 獲取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…

CTF-web-攻防世界-2

1、newscenter (1)、訪問網站&#xff0c;一個搜索欄&#xff0c;像是SQL注入漏洞&#xff0c;brup抓包嘗試一下。 輸入2/0、一個單引號、兩個單引號、一個雙引號、兩個雙引號等。發現只有一個單引號時&#xff0c;響應包content-length字段有非常明顯的變化為0。說明有可能是…

關于堆排序

今天我們不刷力扣了&#xff0c;我們來復習&#xff08;手撕&#xff09;一下數據結構中的八大排序算法之一&#xff0c;堆排序 基本概念&#xff1a; 堆是一種特殊的樹形數據結構&#xff0c;即完全二叉樹。 堆分為大頂堆和小頂堆&#xff1a; 大頂堆&#xff1a;每個節點的值…

OrangePi KunPengPro | 開發板開箱測評之學習與使用

OrangePi KunPengPro | 開發板開箱測評之學習與使用 時間&#xff1a;2024年5月23日20:51:12 文章目錄 OrangePi KunPengPro | 開發板開箱測評之學習與使用概述1.參考2.資料、工具3.使用3-1.通過串口登錄系統3-2.通過SSH登錄系統3-3.安裝交叉編譯工具鏈3-4.復制文件到設備3-5.第…

【組合數學】常考試題答案

一、單項選擇題&#xff08;每小題3分&#xff0c;共15分&#xff09; 1. 用3個“1”和4個“0”能組成&#xff08; &#xff09;個不同的二進制數字。 A. 35 B. 36, C. 37, D. 38 2. 整除300的正整數的個數為&#xff08;  &#xff09;。 A. 14…

Anaconda+CUDA+CUDNN+Pycharm+Pytorch安裝教程(第一節 Anconda安裝)

1.選擇和對應的anconda版本 官網地址&#xff1a;Index of / (anaconda.com) 下載地址&#xff1a;Index of /anaconda/archive/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 2.安裝流程 (1)下載安裝包 (2)點擊next &#xff08;3&#xff09;點擊I agree &a…

解決Flutter位于懸浮窗口時,應用Logo不更新問題

問題描述 我已經更換了應用Logo&#xff0c;但是發現應用處于懸浮窗口時&#xff0c;logo還是更改之前的&#xff1f;下面的圖片只是示意。 解決方案 終端命令 rm -rf ~/Library/Developer/Xcode/DerivedData2.xcode視圖內解決 先在頂部找到 Xcode --> Setting --> Lo…

操作系統入門系列-MIT6.828(操作系統工程)學習筆記(二)----課程實驗環境搭建(wsl2+ubuntu+quem+xv6)

MIT6.S081&#xff08;操作系統&#xff09;學習筆記 操作系統入門系列-MIT6.828&#xff08;操作系統&#xff09;學習筆記&#xff08;一&#xff09;---- 操作系統介紹與接口示例 操作系統入門系列-MIT6.828&#xff08;操作系統工程&#xff09;學習筆記&#xff08;二&am…

Java面向對象-常用類(日期時間類)

常用類-日期時間類 Date&#xff08;java.util.Date&#xff09; – 日期類 SimpleDateFormat – 格式化日期類 Calendar – 日歷類 1 Date類 java.util.Date類表示特定的瞬間&#xff0c;精確到毫秒。 package com.qf.datetime;import java.util.Date;public class Test01 {…

ubantu20.04 跑通ros2版的orbslam2

我的歷程 先編譯的非ros版的robslam2&#xff08;非常詳細&#xff09; ubuntu20.04配置并編譯ORB-SLAM2_ubuntu20.04安裝orb-lslam2-CSDN博客 然后裝ros2&#xff08;非常詳細&#xff09; 詳細介紹如何在ubuntu20.04中安裝ROS系統&#xff0c;超快完成安裝&#xff08;最…