JavaSE面試題02:單例設計模式

来源:https://www.cnblogs.com/runwsh/archive/2023/11/20/JavaInterview02.html
-Advertisement-
Play Games

通俗解釋:單例模式 > 單:唯一 > > 例:實例 > > 單例設計模式,即某個類在整個系統中只能有一個實例對象可被獲取和使用的代碼模式 > > 例如:代表JVM運行環境的Runtime類 ...


單例模式

來源:
https://www.runwsh.com/archives/biitngg1f7s0000

1.什麼事Singleton?

Singleton:在Java中 即指單例設置模式,探視軟體開發最常用的設置模式之一

通俗解釋:單例模式

單:唯一

例:實例

單例設計模式,即某個類在整個系統中只能有一個實例對象可被獲取和使用的代碼模式

例如:代表JVM運行環境的Runtime類

要點:

一是某個類只能有一個實例

​ 構造器私有化

二是他必須自行創建實例

含有一個該類的靜態變數來保存這個唯一的實例

三是它必須自行向整個系統提供這個實例

​ 對外提供獲取該類實例對象的方式

幾種常見形式

餓漢式:

直接創建對象,不存線上程安全問題
直接實例化餓漢式(簡潔直觀)

枚舉式 (最簡潔)

靜態代碼塊餓漢式(適合複雜實例化)

懶漢式:延遲創建對象

線程安全(使用於單線程)

線程不安全(使用於多線程)

靜態內部類模式 (適用於多線程)

代碼實現如下

JavaInterviewQuestion.java


@Data
public class JavaInterviewQuestion {
    private String properties;
    public static final JavaInterviewQuestion INSTANCE_HUNGRY; // 餓漢式
    static {
        INSTANCE_HUNGRY=new JavaInterviewQuestion();
        Properties proper=new Properties();
        try {
            // 餓漢式通常會出現一些需要讀取properties文件一些定義的變數,例如sql的jdbc
            proper.load(JavaInterviewQuestion.class.getClassLoader().getResourceAsStream("application.properties"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        INSTANCE_HUNGRY.setProperties((String) proper.get("cqw"));
    }

    public static JavaInterviewQuestion INSTANCE_LAZY; // 懶漢式
    public JavaInterviewQuestion getInstanceLazyDemo(){
        if (INSTANCE_LAZY == null ) {
            synchronized (INSTANCE_LAZY) { // 防止初始化實例變數時候,多線程創建多個實例不一致的情況。
                if (INSTANCE_LAZY == null){
                    return INSTANCE_LAZY=new JavaInterviewQuestion();
                }
            }
        }
        return INSTANCE_LAZY;
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Vue3中響應數據核心是 reactive , reactive 中的實現是由 proxy 加 effect 組合,我們先來看一下 reactive 方法的定義 ...
  • 背景 近期查看公司項目的請求日誌,發現有一段來自俄羅斯首都莫斯科(根據IP是這樣,沒精力溯源)的異常請求,看傳參就能猜到是EXP攻擊,不是瞎掃描瞎傳參的那種。日誌如下(已做部分修改): [2023-11-17 23:54:34] local.INFO: url : http://xxx/_ignit ...
  • Callable介面和Future介面 創建線程的方式 1.繼承Thread類2.實現Runnable介面3.Callable介面4.線程池方式 Callable介面 在繼承Thread類和實現Runnable介面的方式創建線程時,線程執行的run方法中,返回值是void,即無法返回線程的執行結果, ...
  • 十二、指針和引用(二) 1、指針和數組的關係 1)思考 ​ 假設你要設計一種編程語言,你要如何實現數組呢?思考之前請先牢記:數組在記憶體中是連續的,維度由低到高(大部分操作系統下)。 2)彙編分析數組如何實現 //C++代碼 #include <iostream> int main() { int a ...
  • 主要涵蓋了Spring與持久層技術的整合,以及Spring與MyBatis的整合。第一章介紹了為什麼需要將Spring與持久層技術整合,以及Spring可以與哪些持久層技術進行整合。第二章詳細介紹了Spring與MyBatis的整合思路、開發步驟和編碼實例,並解決了MyBatis開發過程中存在的問題... ...
  • 背景 公司產品部收到了一些重要客戶的需求,他們希望能夠依賴獨立的資料庫存儲來支持他們的業務數據。與此同時,仍有許多中小客戶,可以繼續使用公共庫以滿足其需求。技術實現方面,此前持久層框架使用的Mybatis-plus,部分業務場景使用到了Sharding-JDBC用於分表,另外,我們的資料庫版本控制工 ...
  • 近年來,車輛保險成為廣大車主必須購買的一項重要保障。然而,如何查詢車輛保險狀態及保單信息卻是許多車主面臨的難題。隨著技術的不斷發展,API的出現為我們提供了一條便捷的解決之路。本文介紹的《車輛保險查詢API——查詢車輛保險狀態及保單信息》便是一款實用的API工具。 一、API的介紹 挖數據平臺車輛保 ...
  • hello,大家好!新手小白踏入 Python 的大門有點像冒險,但別擔心,我已經整理了一個超實用的入門指南,幫你規避學習過程中的十大雷區。這裡有關於 Python 的錯誤你應該註意的建議,一起來看看吧! 1. 拼寫錯誤 小心 prin 和 print 的奇妙之旅! # 錯誤示例 prin("Hel ...
一周排行
    -Advertisement-
    Play Games
  • 當使用Autofac處理一個介面有多個實現的情況時,通常會使用鍵(key)進行區分或者通過IIndex索引註入,也可以通過IEnumerable集合獲取所有實例,以下是一個具體的例子,演示如何在Autofac中註冊多個實現,並通過構造函數註入獲取指定實現。 首先,確保你已經安裝了Autofac Nu ...
  • 本篇將分享Prometheus+Grafana的監控平臺搭建,並監控之前文章所搭建的主機&服務,分享日常使用的一些使用經驗本篇將配置常用服務的監控與面板配置:包括 MySQL,MongoDB,CLickHouse,Redis,RabbitMQ,Linux,Windows,Nginx,站點訪問監控,已... ...
  • 使用Aspirate可以將Aspire程式部署到Kubernetes 集群 工具安裝 dotnet tool install -g aspirate --prerelease 註意:Aspirate 正在開發中,該軟體包將作為預覽版進行版本控制,--prelease 選項將獲得最新的預覽版。 容器註 ...
  • 前言 本文要說的這種開發模式,這種模式並不是只有blazor支持,js中有一樣的方案next.js nuxt.js;blazor還有很多其它內容,本文近關註漸進式開發模式。 是的,前後端是主流,不過以下情況也許前後端分離並不是最好的選擇: 小公司,人員不多,利潤不高,創業階段能省則省 個人開發者,接 ...
  • 在.NET中,Microsoft.Extensions.Logging是一個靈活的日誌庫,它允許你將日誌信息記錄到各種不同的目標,包括資料庫。在這個示例中,我將詳細介紹如何使用Microsoft.Extensions.Logging將日誌保存到MySQL資料庫。我們將使用Entity Framewo ...
  • chatgpt介面開發筆記3: 語音識別介面 1.文本轉語音 1、瞭解介面參數 介面地址: POST https://api.openai.com/v1/audio/speech 下麵是介面文檔描述內容: 參數: { "model": "tts-1", "input": "你好,我是饒坤,我是ter ...
  • 前面兩篇文章主要是介紹瞭如何解決高併發情況下資源爭奪的問題。但是現實的應用場景中除了要解決資源爭奪問題,高併發的情況還需要解決更多問題,比如快速處理業務數據等, 本篇文章簡要羅列一下與之相關的更多技術細節。 1、非同步編程:使用async和await關鍵字進行非同步編程,這可以避免阻塞線程,提高程式的響 ...
  • 大家好,我是棧長。 Nacos 2.3.0 前幾天正式發佈了,新增了不少實用性的新功能,真是史上最強版本。 Nacos 2.3.0 還真是一個比較重要的大版本,因為它涉及了太多重大更新,今天棧長給大家來解讀下。 Nacos 先掃個盲: Nacos 一個用於構建雲原生應用的動態服務發現、配置管理和服務 ...
  • IDEA的遠程開發功能,可以將本地的編譯、構建、調試、運行等工作都放在遠程伺服器上執行,而本地僅運行客戶端軟體進行常規的開發操作即可,舊版本IDEA目前不支持該功能.,本例使用的是IDEA2023.2.5版本 下麵介紹如何在IDEA中設置遠程連接伺服器開發環境並結合Cpolar內網穿透工具實現無公網 ...
  • 本文解釋為啥會有響應式編程,為什麼它在開發者中不太受歡迎,以及引入 Java 虛擬線程後它可能最終會消失。 命令式風格編程一直深受開發者喜愛,如 if-then-else、while 迴圈、函數和代碼塊等結構使代碼易理解、調試,異常易追蹤。然而,像所有好的東西一樣,通常也有問題。這種編程風格導致線程 ...