1. 程式人生 > >常見的單例模式寫法

常見的單例模式寫法

單例模式是面試中最常被問到的地方,那麼如何理解單例模式呢?

單例模式的特點:
  1、單例類只能有一個例項。
  2、單例類必須自己自己建立自己的唯一例項。
  3、單例類必須給所有其他物件提供這一例項。

單例在寫法上又分為懶漢模式(執行緒安全,執行緒不安全)、餓漢模式(天生執行緒安全)、雙重校驗鎖等常見寫法。

但是最後會發現所有的單例模式都是static關鍵字進行修飾的方法,為什麼呢?因為static是所有執行緒共享的區域,具體可以瞭解下JVM記憶體相關知識。

懶漢模式怎麼理解呢?

就是很懶,在每次呼叫的時候才去例項化,也可以理解為:在類載入時不進行初始化。

餓漢模式怎麼理解呢?

就是在類載入時就完成了初始化,所以類載入比較慢,但獲取物件的速度快(已經初始化好了,所以快)。

一:懶漢模式,執行緒不安全

/**
 * 單例一  懶漢,執行緒不安全
 * @author kobe
 *
 */
public class SingletonDemo01 {

	private static SingletonDemo01 instance;
	
	private SingletonDemo01() {
		
	}
	
	public static SingletonDemo01 getInstance(){
        if (instance == null) {
            instance = new SingletonDemo01();
        }
        return instance;
    }
	
}

 二:懶漢模式,執行緒安全(用 synchronized確保安全)

/**
 * 單例二 懶漢 執行緒安全
 * @author kobe
 *
 */
public class SingletonDemo02 {

	private static SingletonDemo02 instance;
	
	private SingletonDemo02() {
		
	}
	
	public static synchronized SingletonDemo02 getInstance() {
		if(instance == null) {
			instance = new SingletonDemo02();
		}
		return instance;
	}
	
}

三:餓漢模式,執行緒天生安全 

/**
 * 餓漢模式
 * @author kobe
 *
 */
public class SingletonDemo03 {

	private static SingletonDemo03 instance = new SingletonDemo03();
	
	private SingletonDemo03() {
		
	}
	
	public static SingletonDemo03 getInstance() {
		return instance;
	}
	
}

四:懶漢模式,執行緒安全 (方式二的變種,需要在JDK1.5以後才能這樣使用)

/**
 * 單例四  雙重校驗鎖
 * @author kobe
 *
 */
public class SingletonDemo04 {
	
	private volatile static SingletonDemo04 instance;
	
	private SingletonDemo04() {
		
	}
	
	public static SingletonDemo04 getInstance() {
		if (instance == null) {
			synchronized (SingletonDemo04.class) {
				if(instance == null) {
					instance = new SingletonDemo04();
				}
			}
		}
		
		return instance;
	}

}