[design pattern](7) Singleton

前言

上面的章節中,咱們介紹了工廠模式,它是建立型模式的一種。本章咱們將會介紹 單例模式 ,它也是建立型模式的一種。單例模式是咱們比較經常使用的一個設計模式,也是最簡單的一種設計模式。java

單例模式

介紹:確保在一個jvm中某個類有且只有一個實例。設計模式

類圖:安全

從上面的類圖中,咱們能夠總結出如下幾點:多線程

  • 單例模式須要實現一個私有的構造函數,防止有外部的語句會實例化該類。
  • 單例模式須要定義一個靜態成員變量,用來指向該類的惟一實例。
  • 單例模式須要定義一個靜態成員方法,用來返回該類惟一的實例。

單例模式的實現

單例模式的實現方式有8種,下面讓咱們分別來看一看這幾種實現方式的區別。jvm

餓漢模式

代碼:函數

public class Singleton {
    private Singleton() {}
    private static Singleton singleton = new Singleton();
    public static Singleton initSingleton() {
        return singleton;
    }
}

 

 

  • 是不是懶加載:否
  • 是否線程安全:是
  • 優勢:不用加鎖,執行效率高。
  • 缺點:類加載時就初始化,浪費內存。

餓漢模式(靜態代碼塊初始化)

代碼:spa

public class Singleton {
    private Singleton() {}
    private static Singleton singleton;
    static {
        singleton = new Singleton();
    }
    public static Singleton initSingleton() {
        return singleton;
    }
}

 

 

  • 是不是懶加載:否
  • 是否線程安全:是
  • 優勢:不用加鎖,執行效率高。
  • 缺點:類加載時就初始化,浪費內存。

懶漢模式

import java.util.Objects;

public class Singleton {
    private Singleton() {}
    private static Singleton singleton;
    public static Singleton initSingleton() {
        if (Objects.isNull(singleton)) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:否
  • 優勢:不用加鎖,執行效率高,第一次調用時初始化,避免了浪費內存。
  • 缺點:非線程安全,多線程環境下,可能會產生多個實例。

懶漢模式(線程安全)

import java.util.Objects;

public class Singleton {
    private Singleton() {}
    private static Singleton singleton;
    public static synchronized Singleton initSingleton() {
        if (Objects.isNull(singleton)) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:是
  • 優勢:第一次調用時初始化,避免了浪費內存。
  • 缺點:實現了synchronized方法,會影響執行效率。

懶漢模式(同步代碼塊)

import java.util.Objects;

public class Singleton {
    private Singleton() {}
    private static Singleton singleton;
    public static Singleton initSingleton() {
        if (Objects.isNull(singleton)) {
            synchronized (Singleton.class) {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:否
  • 優勢:第一次調用時初始化,避免了浪費內存。
  • 缺點:雖然實現了synchronized代碼塊,可是若是有多個線程同時實例化,那麼有可能會產生多個實例。

雙重檢查模式

import java.util.Objects;

public class Singleton {
    private Singleton() {}
    private static volatile Singleton singleton;
    public static Singleton initSingleton() {
        if (Objects.isNull(singleton)) {
            synchronized (Singleton.class) {
                if(Objects.isNull(singleton)) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:是
  • 優勢:第一次調用時初始化,避免了浪費內存。
  • 缺點:暫無

靜態內部類

public class Singleton {
    private Singleton() {}
    public static Singleton initSingleton() {
        return SingletonInstance.singleton;
    }

    public static class SingletonInstance {
        private static Singleton singleton = new Singleton();
    }
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:是
  • 優勢:第一次調用時初始化,避免了浪費內存,效率高。
  • 缺點:暫無

枚舉

public enum Singleton {
    INSTANCE;
}

 

 

  • 是不是懶加載:是
  • 是否線程安全:是
  • 優勢:第一次調用時初始化,避免了浪費內存,效率高。
  • 缺點:暫無
相關文章
相關標籤/搜索