成人免费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

2021-12-06 08:59:40

RabbitMQ單例寫法

2020-10-27 12:07:17

DevOps單頁應用程序開發

2015-10-27 09:19:24

2021-09-07 10:44:35

異步單例模式

2023-10-18 17:49:58

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

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产色综合久久不卡蜜臀 | 一区二区三区免费 | 中文字幕 亚洲一区 | 国产成人精品一区二区三区 | 日韩一区中文字幕 | 国产二区av| 日本中文字幕在线视频 | 国产激情综合五月久久 | 另类a v| 一色桃子av一区二区 | 成人精品一区二区三区中文字幕 | 国产一级片一区二区三区 | 国产精品成人在线 | 99精品电影| 欧美日韩中文国产一区发布 | 岛国一区 | 午夜网站视频 | 国产综合区 | 特级a欧美做爰片毛片 | 欧美一级淫片免费视频黄 | 亚洲一区精品视频 | 在线观看亚洲精品视频 | 一区二区中文 | 日韩精品成人在线 | 国产精品视频导航 | 国产欧美一区二区三区久久手机版 | 一区二区三区国产好 | 五月综合久久 | 男女搞网站 | 欧美a在线看 | 午夜网站视频 | 成人小视频在线观看 | 神马久久av | 在线免费观看日本 | av一区二区三区 | 亚洲久视频| 最新国产精品精品视频 | 亚洲日本乱码在线观看 | 色悠悠久 | 成在线人视频免费视频 | 国产精品波多野结衣 |