天天看點

Java 單例模式的使用

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/50750731

1.單例模式的定義

確定某一個類中隻有一個執行個體,而且自行執行個體化并且向整個系統提供一個執行個體。

singleton包下的Singleton是懶漢式單例,Singleton雙檢查單例,Singleton2餓漢式單例

2.單例模式的使用場景:

確定某個類有且隻有一個執行個體。避免産生多個對象消耗過多的資源,或者某種類型的對象隻應該有且既有一個。

例如建立一個對象需要消耗資源過多,如要通路IO和資料庫資源、網絡資源,這事就要考慮使用單例

3單例模式的關鍵點:

(1)構造方法私有化,一般為private

(2).通過一個靜态方法傳回單例對象。

(3)確定單例類對象隻有一個,尤其是在多線程的情況下。

(4)確定單例類對象在反序列化時,不重新建構對象。

4.代碼實作

4.1懶漢式單例

package singleton;
/**
 * 懶漢式單列模式
 * @author Administrator
 * @優點:單例隻有在使用的時候才會初始化化,在一定程度上節約了資源。
 * @缺點:第一次加載時需要及時的進行初始化,反應稍微慢,最大的問題是每次調用getInstance
 * 都是同步,造成了不必要的開銷,一般不建議使用。
 */
public class Singleton {

	private static Singleton instance;
	
	private Singleton(){}
	//同步方法
	public static synchronized Singleton getInstance(){
	
		if(instance==null){
			instance = new Singleton();
		}
		return instance;
		
	}
	
	public static void main(String[] args) {
		System.out.println();
	}
	
}
           

4.2雙檢查單例(DCL)模式

package singleton;

/**
 * 
 * @author lidong
 * @優點:既能夠在需要的時候初始化單例,又能夠保證線程安全。 并且單例對象初始化後調用getInstance不進行同步鎖。
 * @延遲加載方式
 */
public class Singleton1 {

	private static Singleton1 instance = null;

	private Singleton1() {
	}

	public static Singleton1 getInstance() {

		if (instance == null) {//避免不必要的同步
			synchronized (Singleton1.class) {
				if (instance == null) {//為null的時候建立執行個體
					instance = new Singleton1();
				}
			}
		}
		return instance;
	}
}
           

3.餓漢式單例

package singleton;
/**
 * 餓漢式單例
 * @author lidong
 * @預先加載方式
 */
public class Singleton2 {

	
	private static Singleton2 instance = new Singleton2();

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

測試類

package singleton;

public class Test {
	
	public static void main(String[] args) {
		//餓漢式
		Singleton2 s1 = Singleton2.getInstance();
		Singleton2 s2 = Singleton2.getInstance();
		System.out.println(s1.equals(s2));
		
		//懶漢式
		Singleton s3 = Singleton.getInstance();
		Singleton s4 = Singleton.getInstance();
		System.out.println(s3.equals(s4));
		
		//雙枷鎖模式
		Singleton1 s5 = Singleton1.getInstance();
		Singleton1 s6 = Singleton1.getInstance();
		System.out.println(s5.equals(s6));
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
		System.out.println(s4);
		System.out.println(s5);
		System.out.println(s6);
	}
	

}
           

結果:

true
true
true
singleton.Singleton2@12b6651
singleton.Singleton2@12b6651
singleton.Singleton@4a5ab2
singleton.Singleton@4a5ab2
singleton.Singleton1@1888759
singleton.Singleton1@1888759           
下載下傳位址