成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手撕單例的五種寫法!

開發 前端
單例模式是一種常見的設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。當然,它也是面試中的常客,尤其是某手面試中經常要求應聘者手撕,所以今天咱們就來盤盤它。

單例模式是一種常見的設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。當然,它也是面試中的常客,尤其是某手面試中經常要求應聘者手撕,所以今天咱們就來盤盤它。

單例模式的實現方式有很多,如下圖所示:

具體實現如下。

1.餓漢式模式

此在餓漢式單例模式中,實例在類加載時就被創建,這種方式的優點是實現簡單,線程安全(因為類加載過程是線程安全的)。缺點是可能會導致實例過早創建,如果實例創建過程比較耗時或者占用大量資源,而在程序運行初期并不需要該實例,就會造成資源浪費。

public class Singleton {
    // 1.私有靜態成員變量,在類加載時就創建實例
    private static Singleton instance = new Singleton();

    // 2.私有構造函數,防止外部通過構造函數創建實例
    private Singleton() {}

    // 3.公共靜態方法,用于獲取唯一的實例
    public static Singleton getInstance() {
        return instance;
    }
}

2.懶漢模式(非安全)

懶漢式單例模式在第一次調用 getInstance 方法時才創建實例,這樣可以避免實例過早創建。但上述代碼是非線程安全的,在多線程環境下,可能會出現多個線程同時進入 if 語句,導致創建多個實例的情況。

public class Singleton {
    // 1.私有靜態成員變量,初始化為null
    private static Singleton instance = null;

    // 2.私有構造函數,防止外部通過構造函數創建實例
    private Singleton() {}

    // 3.公共靜態方法,用于獲取唯一的實例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3.懶漢模式(安全效率低)

此版本的懶漢式單例模式通過在 getInstance 方法上添加 synchronized 關鍵字,使其成為線程安全的。但這種方式的缺點是每次調用 getInstance 時都需要獲取鎖,會導致性能下降,尤其是在高并發環境下。

public class Singleton {
    // 1.私有靜態成員變量,初始化為null
    private static Singleton instance = null;

    // 2.私有構造函數,防止外部通過構造函數創建實例
    private Singleton() {}

    // 3.公共靜態方法,用于獲取唯一的實例
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

4.雙重檢查鎖模式

雙重檢查鎖定模式在懶漢式基礎上進行了優化,通過兩次檢查 instance 是否為 null,既保證了在第一次需要實例時創建實例,又在一定程度上避免了每次調用 getInstance 都獲取鎖的情況,提高了性能。不過,由于指令重排序等問題,可能會導致一些錯誤,因此需要在 instance 變量前添加 volatile 關鍵字來解決。

public class Singleton {
    // 1.私有靜態成員變量,初始化為null
    private volatile static Singleton instance = null;

    // 2.私有構造函數,防止外部通過構造函數創建實例
    private Singleton() {}

    // 3.公共靜態方法,用于獲取唯一的實例
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

5.靜態內部類模式

這種方式利用了靜態內部類的特性,當外部類被加載時,靜態內部類不會被加載,只有當調用 getInstance 方法時,靜態內部類才會被加載,此時才創建單例實例。這種實現方式既保證了線程安全,又避免了在不需要實例時過早創建實例,是一種比較常用的單例模式實現方式。

public class Singleton {
    // 1.私有構造函數,防止外部通過構造函數創建實例
    private Singleton() {}

    // 2.靜態內部類,其中包含單例實例
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    // 3.公共靜態方法,用于獲取唯一的實例
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

小結

單例模式雖然實現方式有 5  種:餓漢模式、懶漢非安全模式、懶漢安全模式、雙重較驗鎖模式、靜態內部類模式,但它的寫法基本都是以下三步:

  • 定義私有構造方法(防止 new 多個實例)。
  • 定義私有變量(承接單例對象)。
  • 定義統一返回對象的方法。
責任編輯:姜華 來源: 磊哥和Java
相關推薦

2022-08-10 11:02:56

Python單例模式

2023-11-13 16:49:51

C++單例

2021-07-15 14:29:06

LRU算法

2021-09-06 08:13:35

APM系統監控

2022-05-23 07:35:15

單例模式懶漢模式靜態內部類

2021-09-04 07:56:44

單例模式寫法

2021-06-10 09:00:33

單例模式數據庫

2020-09-15 08:55:07

算法數據基礎

2020-09-17 14:04:32

拷貝

2018-04-03 15:38:07

Java單例模式模式設計

2020-09-16 14:17:42

flat方法

2021-10-31 07:38:37

排序算法代碼

2023-09-18 09:10:11

Golang高性能緩存庫

2020-04-27 08:31:29

單例模式Python軟件設計模式

2021-06-09 07:01:30

前端CallApply

2020-10-27 12:07:17

DevOps單頁應用程序開發

2021-12-06 08:59:40

RabbitMQ單例寫法

2015-10-27 09:19:24

2021-09-07 10:44:35

異步單例模式

2023-10-18 17:49:58

數據結構隊列結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品揄拍一区二区 | 国产一区二区久久 | 中文字幕在线观看国产 | 欧美亚洲另类丝袜综合网动图 | www精品美女久久久tv | 欧美日韩国产一区 | 久久91av| 久久精品视频网站 | 欧美日韩中文国产一区发布 | 日韩国产在线 | 中文字幕av网站 | 国产9久| 亚洲视频在线看 | www.日韩系列| 人和拘一级毛片c | 午夜视频在线观看网址 | 日韩一区中文字幕 | 人人性人人性碰国产 | 午夜精品久久久久久久久久久久 | 一级a毛片 | 欧美日韩国产在线观看 | 日日干天天干 | 久草资源 | 亚洲自拍一区在线观看 | 国产一区二区三区在线 | 喷水毛片 | 亚洲在线视频 | 欧美在线观看一区 | 狠狠干在线 | 欧美精品1区2区 | 成人在线免费电影 | 特一级毛片 | 久久久99国产精品免费 | 视频一区二区在线观看 | 久久久精品国产 | 亚洲视频在线观看 | 一区二区视屏 | 丁香六月激情 | 国产91久久久久久久免费 | 精品久久久久久18免费网站 | 亚洲电影一区二区三区 |