核心作用
保證一個類只有一個實例,並且對外提供一個訪問該實例的一個接口。
常見應用場景
- Windows的任務管理器,回收站
- 數據庫連接池
- Servlet
- Spring中,每個bean默認是單例的
實現方式
餓漢式(線程安全,調用效率高,但是,不能延時加載)
public class Singleton {
//類初始化時,立即加載這個對象(沒有延時加載的優勢)
private static Singleton instance = new Singleton();
private Singleton(){} //私有化構造器
//方法沒有同步,調用效率高
public static Singleton getInstance(){
return instance;
}
}
懶漢式(線程安全,調用效率不高,但是,可以延時加載)
public class Singleton {
//類初始化時,不初始化對象,只有當真正用的時候在加載(延時加載)
private static Singleton instance;
private Singleton(){} //私有化構造器
//方法同步,調用效率不高
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
靜態內部類(線程安全,調用效率高,並且延時加載)
package com.ck.singleton;
public class Singleton {
private static class SingletonClassInstance{
private static final Singleton instance = new Singleton();
}
private Singleton(){} //私有化構造器
//方法沒有同步,調用效率高
public static Singleton getInstance(){
return SingletonClassInstance.instance;
}
}
雙重檢查鎖
public class Singleton {
/**
* 一開始不進行對象的創建
* volitile 能夠防止指令重排序
*/
private static volatile Singleton instance;
private Singleton(){};
/**
* 當使用的時候纔去創建對象
* @return 對象實例
*/
public static Singleton getInstance(){
if(null == instance){
synchronized(Singleton.class){
if(null == instance){
//這裏會出現指令重排序,應爲new不是一個原子操作
instance = new Singleton();
}
}
}
return instance;
}
}
餓漢式 | 22ms |
懶漢式 | 636ms |
靜態內部類 | 28ms |
雙重檢查鎖 | 65ms |