餓漢式
餓漢式就是在變量申明的時候就完成初始化工作
優點:沒有線程安全性問題
缺點:在程序加載時,單例模式的實體就已經被創建了,存在性能問題
public class Singleton {
// 私有化構造方法
private Singleton () {}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
懶漢式
懶漢式就是在變量需要使用的時候調用初始化函數進行構造
package com.roocon.thread.t5;
public class Singleton2 {
private Singleton2() {}
private static volatile Singleton2 instance;
/**
* 雙重檢查加鎖
*
* @return
*/
public static Singleton2 getInstance () {
// 考慮到程序性能,不能直接在方法中加synchronized,應該加在方法塊上
if(instance == null) {
synchronized (Singleton2.class) {
if(instance == null) {
instance = new Singleton2(); // 指令重排序
// 申請一塊內存空間 // 1
// 在這塊空間裏實例化對象 // 2
// instance的引用指向這塊空間地址 // 3
}
}
}
return instance;
}
}