回覆列表
  • 1 # 五星村小黃

    單例模式 (Singleton)就是要確保類在記憶體中只有一個物件,該例項必須自動建立,並且對外提供。

    In eager initialization, the object is created in the program execution, in a normal way, which sometimes the programmer may not use it in the program. This looks waste of memory and processor time.

    Other way is to create the object when the programmer really requires. This is called lazy initialization (one of the design patterns). That is, if the object is created at runtime, only when the programmer requires is known as lazy initialization.

    餓漢式: 類載入的時候就例項化物件了,這樣做節約了時間,並且執行緒安全,但是浪費記憶體空間。如果該例項從始至終都沒被使用過,則會造成記憶體浪費。

    懶漢式 :需要使用例項的時候才去載入,這麼做節約了記憶體空間,浪費了時間,執行緒不安全的。這種也叫做延遲載入。

    我們來看看餓漢式的程式碼:

    public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {

    return instance;

    }

    }

    再看看懶漢式 延遲載入的:

    public class LazySingleton {

    private static LazySingleton instance;

    private LazySingleton() {}

    public static LazySingleton getInstance() {

    if (instance == null) {

    instance = new LazySingleton();

    }

    return instance;

    }

    }

    這種在多執行緒下是不安全的,因此有一種double-checked locking的解決方案,

    進行了兩次null檢查,這樣就可以保證執行緒安全了。這樣,例項化程式碼只用執行一次,後面再次訪問時,判斷是否為 null,直接return例項化物件。同時,對singleton物件使用volatile關鍵字進行限制,保證其對所有執行緒的可見性,並且禁止對其進行指令重排序最佳化。程式碼如下:

    public class DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton instance;

    private DoubleCheckSingleton() {}

    public static DoubleCheckSingleton getInstance() {

    if (instance == null) {

    synchronized (DoubleCheckSingleton.class) {

    if (instance == null) {

    instance = new DoubleCheckSingleton();

    }

    }

    }

    return instance;

    }

    }

    其次也可以使用列舉的方式。

  • 中秋節和大豐收的關聯?
  • 草鯉魚怎麼燉好吃?