1. 程式人生 > >設計模式專題之單例模式

設計模式專題之單例模式

1.單例模式 惡漢式
 特點:天生執行緒安全,效率高,但是不能延遲載入

package com.wangyu;

/**
 * 單例模式 惡漢式
 * 特點:天生執行緒安全,效率高,但是不能延遲載入
 * @author zjmiec
 *
 */
public class SingletonDemo1 {

	// 類初始化立即載入
	private static SingletonDemo1 instance = new SingletonDemo1();

	private   SingletonDemo1() {}
	public  static SingletonDemo1  getInstance() {
		return instance;
}
	
}

2.  單例模式 懶漢式

package com.wangyu;

import com.sun.corba.se.impl.orbutil.concurrent.Sync;

/**
 * 單例模式 懶漢式 特點,效率低,支援延遲載入 資源利用率高了,但是併發效率低 synchronized 要同步
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo2 {

	// 類初始化不會立即載入,用到的時候建立
	private static SingletonDemo2 instance;

	private SingletonDemo2() {
	}

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

}

3. 雙重鎖機制實現單例模式

package com.wangyu;

/**
 * 
 * 雙重鎖機制實現單例模式 (由於jvm底層優化,使用過程會出現問題不建議使用)
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo3 {

	// 類初始化不會立即載入,用到的時候建立
	private static SingletonDemo3 instance = null;

	private SingletonDemo3() {
	}

	public static synchronized SingletonDemo3 getInstance() {
		if (instance == null) {
			SingletonDemo3 sc;
			synchronized (SingletonDemo3.class) {
				sc = instance;
				if (sc == null) {
					synchronized (SingletonDemo3.class) {
						if (sc == null) {
							sc = new SingletonDemo3();
						}

					}
					instance=sc;
				}
			}
		}
		 return instance;
	}

}

4.靜態內部類方式實單例模式

package com.wangyu;

/**
 * 
 * 靜態內部類方式實單例模式
 *  特點:
 *  沒有static屬性,不會像惡漢模式立即載入 只有真正呼叫的geiInstance,
 *  才會載入靜態內部類,且載入過程執行緒安全
 * instances是 static final型別,保證記憶體中只有一個例項,
 * 而且只能被賦值一次 保證執行緒安全,同時兼備併發高效和延遲載入的優勢
 * 
 * @author zjmiec
 *
 */
public class SingletonDemo4 {

	private static class SingletonClassInstance {
		private static final SingletonDemo4 instance =new SingletonDemo4();
	}

	private SingletonDemo4() {
	}

	public SingletonDemo4 getInstance(){
		return SingletonClassInstance.instance;
	}
}

5.列舉方式實現單利模式

package com.wangyu;

/**
 * 列舉方式實現單利模式(沒有延遲載入的屬性)
 * 執行緒安全呼叫效率高
 * @author zjmiec
 *
 */
public enum SingletonDemo5 {
	// 這個列舉元素,本身就是單例
	INSTANCE;
	//新增自己的操作
	public void singletonOperation() {
	}
}

測試:

對比總結:

常見的五種單例模式實現方式

一主要:
       ------餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。 )。

       ------懶漢式(執行緒安全,呼叫效率不高。但是,可以延時載入。 )

一其他:
       ------雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)。

       ------靜態內部類式(執行緒安全,呼叫效率高。但是,可以延時載入)
       ------列舉式(執行緒安全,呼叫效率高,不能延時載入。並且可以天然的防止反射和反序列化漏洞!)
如何選用?
       -------單例物件佔用資源少,不需要延時載入:
              列舉式好於餓漢式
       ------單例物件佔用資源大,需要延時載入:
             靜態內部類式  好於懶漢式