單例模式的四種實現方法

核心作用

保證一個類只有一個實例,並且對外提供一個訪問該實例的一個接口。

常見應用場景

  • 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章