單例模式
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;
}
}
此方法不僅保證了對象的唯一性而且還提升擷取對象的效率,即建立對象時上鎖,一旦對象建立完畢後,擷取對象就不會觸發上鎖的代碼。