天天看點

實作單例模式

單例模式

1.什麼是單例模式

通俗講:在建立對象時,有且隻有一個對象,給所有對象提供這一執行個體對象。

2.如何實作單例模式

首先将構造方法私有化,提供一個對外的靜态方法,靜态方法則包含單例類的對象。單例模式分為懶漢和餓漢。

public class Single{
	private Single(){}
	private static Single single=new Single();
	public static Single getInstance(){
				return single;
			}
	}
//簡單手撸
           

以上表示餓漢模式-此模式的線程是安全的,但它一直消耗了記憶體,因為在加載這個單例類時就已經建立了單列類的對象,此模式也符合我們實作單例模式的要求。

public class Single{
	private Single(){}
	private static Single single=null;
	public static Single getInstance(){
		if(sinle==null){//假設線程1執行到這時,
					//cpu的資源給了線程2,兩個線程都進了if
				//是以這個單例對象就不是唯一的
			single=new Single();
			}
		return single;
		} 
	}
           

以上表示懶漢模式:當你需要使用的時候才建立,線程不安全。

如何改進懶漢模式線程的不安全?

1.加同步鎖synchronized

直接在單例類提供的靜态方法上加synchronized

2.優雅的方式(雙重檢查加鎖)

public class Single{
	private Single(){}
	private static Single single=null;
	public static Single getInstance(){
		if(sinle==null){
			synchronized(Single.class){
				if(sinle==null){
					single=new Single();
				}
			}
		return single;
		} 
	}
           

此方法不僅保證了對象的唯一性而且還提升擷取對象的效率,即建立對象時上鎖,一旦對象建立完畢後,擷取對象就不會觸發上鎖的代碼。