詳細介紹單例模式
首先我們來看看單例模式的定義:
單例模式是Java 中最簡單的設計模式之一,屬於建立型模式,它提供了一種創建物件的最佳方式。單例模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對像被創建。
(推薦教程:java入門教程)
為了保證內存中有且僅有一個對象,避免頻繁的創建對象造成對內存的消耗,讓所有需要呼叫這個物件的地方都使用這一個單例物件。
接下來我們來看看單例模式的類型:
1、懶漢式
#懶漢式指的是需要使用的時候才會去建立該單例對象。
懶漢式單例模式實作:
public class Singleton { private static Singleton singleton; private Singleton(){ } public static Singleton getInstance(){ if (singleton == null) { singleton = new Singleton(); } return singleton; }
對於懶漢式單例實作有一個問題,就是如何確保只建立一個物件?若兩個或多個執行緒同時判斷singleton為空,則會建立多個物件。因此我們需要解決線程安全性問題。
說到執行緒安全想到的就是加鎖了,加鎖無非是在方法或類別物件上加鎖。
//在方法上加锁 public class Singleton { private static Singleton singleton; private Singleton(){} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } } //在类对象上加锁 public class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance() { synchronized(Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } return singleton; } }
這兩個方法,能解決多執行緒同時建立單例物件的問題,但每次取得物件都需要先取得鎖,並發效能差。因此還需要最佳化,最佳化目標為:如果沒有實例化對象,則加鎖創建,如果有實例化對象,則直接返回。
(學習影片推薦:java課程)
對於在方法上加鎖,無論是否存在實例化物件都需要加鎖。故我們需要優化的是在類別物件上加鎖。
//DCL单例模式(Double Check + Lock) public class Singleton { //volatite关键词防止指令重排序,下文介绍 private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance() { //如果singleton不为空,则直接返回对象,若多个线程发现singleton为空,则进入分支 if (singleton == null) { //多个线程同时争抢一个锁,只有一个线程能成功,其他线程需等待 synchronized(Singleton.class) { //争抢到锁的线程需再次判断singleton是否为空,因为有可能被上个线程实例化了 //若不为空则实例化,后续线程再进入的时候则直接返回该对象 //对于之后所有进入该方法的线程则无需获取锁,直接返回对象 if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
上述程式碼中加入了volatile關鍵字防止指令重新排序。
2、餓漢式
餓漢式指的是在類別載入時即建立該單例物件。
餓漢式單例模式實作:
public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return singleton; }
總結:
懶漢式:需要時才去實例化對象,在開發中如果對記憶體要求很高即採用懶漢式,在多線程環境下,應該使用DCL單例模式,使用DCL單例模式,解決了並發安全及性能低下的問題,若添加volatile關鍵字還能防止指令重新排序而發生的NPE異常。
餓漢式: 類別載入時就已經實例化對象,如果對記憶體需求不高即採用餓漢式,簡單不易出錯,且沒有任何並發安全與效能問題。
以上是詳細介紹單例模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JS 單例模式是常用的設計模式,它可以保證一個類別只有一個實例。這種模式主要用於管理全域變量,避免命名衝突和重複加載,同時也可以減少記憶體佔用,提高程式碼的可維護性和可擴展性。

單例模式:透過函數重載提供不同參數的單例實例。工廠模式:透過函數重寫建立不同類型的對象,實現創建過程與特定產品類別的解耦。

在軟體開發中,常常遇到多個物件需要存取同一個資源的情況。為了避免資源衝突以及提高程式的效率,我們可以使用設計模式。其中,單例模式是一種常用的創建物件的方式,即保證一個類別只有一個實例,並提供全域存取。本文將為大家介紹如何使用PHP實作單例模式,並提供一些最佳實務的建議。一、什麼是單例模式單例模式是一種常用的創建物件的方式,它的特點是保證一個類別只有一個實例,並提

PHP中單例模式的線程安全性問題思考在PHP程式設計中,單例模式是一種常用的設計模式,它可以確保一個類別只有一個實例,並且提供一個全域的存取點來存取這個實例。然而,在多執行緒環境下使用單例模式時,需要考慮線程安全性的問題。單例模式的最基本實作包括一個私有的建構子、一個私有的靜態變數和一個公有的靜態方法。具體程式碼如下:classSingleton{pr

Singleton模式確保一個類別只有一個實例,並提供了一個全域的存取點。它確保在應用程式中只有一個物件可用,並處於受控狀態。 Singleton模式提供了一種訪問其唯一物件的方式,可以直接訪問,而無需實例化類別的物件。範例<?php classdatabase{ publicstatic$connection; privatefunc

導言PHP設計模式是一組經過驗證的解決方案,用於解決軟體開發中常見的挑戰。透過遵循這些模式,開發者可以創建優雅、健壯和可維護的程式碼。它們可協助開發者遵循SOLID原則(單一職責、開放-封閉、Liskov替換、介面隔離和依賴反轉),從而提高程式碼的可讀性、可維護性和可擴展性。設計模式的類型有許多不同的設計模式,每種模式都有其獨特的目的和優點。以下是一些最常用的php設計模式:單例模式:確保一個類別只有一個實例,並提供一種全域存取此實例的方法。工廠模式:建立一個對象,而不指定其確切類別。它允許開發者根據條件

單例模式在PHP框架中的擴展與自訂【引言】單例模式是一種常見的設計模式,它保證類別在整個應用程式中只能實例化一次。在PHP開發中,單例模式的應用非常廣泛,特別是在框架的開發和擴展。本文將介紹如何在PHP框架中擴展和自訂單例模式,並提供具體的程式碼範例。 【什麼是單例模式】單例模式是指一個類別只能有一個物件實例存在,並提供一個全域存取點供外部使用。在PHP開發中,通

單例模式在PHP分散式系統中的應用場景和執行緒安全流程引言:隨著網際網路的快速發展,分散式系統已成為現代軟體開發的熱門話題。而在分散式系統中,線程安全性一直是重要的問題。在PHP開發中,單例模式是一種常用的設計模式,它可以有效地解決資源共享和執行緒安全性的問題。本文將重點討論單例模式在PHP分散式系統中的應用場景和執行緒安全流程,並提供具體的程式碼範例。一、單例模式的
