Java單例模式的三種實現方式
阿新 • • 發佈:2018-12-25
單例模式之餓漢式
在類載入時就初始化一個類物件,使用靜態載入,但是在類載入時就例項化物件,單例物件較大的時候會影響系統載入速度。
public class Singleton {
private Singleton() {
System.out.println("This is constructor.");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance () {
return instance;
}
public static void main(String[] args) {
Singleton.getInstance();
}
}
延遲載入的singleton
只有在訪問到單例物件的時候才去檢查和例項化單例物件,滿足延遲載入,但多執行緒訪問時需要加執行緒同步,影響訪問效率
public class LazySingleton {
private LazySingleton() {}
private static LazySingleton instance ;
public synchronized static LazySingleton getInstance () { //對於多執行緒訪問的需加synchronized
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
使用靜態內部類來作為singleton的容器
既能延遲載入,又能保證執行緒安全
public class StaticSingleton {
private StaticSingleton() {}
private static class SingletonHolder { //私有內部類在StaticSingleton 載入時,不初始化
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance () {
return SingletonHolder.instance;
}
}