黑馬程式設計師一單例設計模式的餓漢式與懶漢式以及加鎖的情況
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a>、期待與您交流! ----------
首先,我們以類Single為例,做一個單例設計模式
一個類在記憶體中只有一個物件,只操作一個物件,所以該類只會提供一個獲得物件的方法,
返回值型別為類型別,返回的內容為物件
//同步函式被靜態修飾後,用的鎖synchronized是this
//靜態進記憶體中,沒有本類物件,但是有該類對應的位元組碼檔案物件 類.class
餓漢式
所謂餓漢式,在程式碼塊初始化的時候,就會生成一個物件,
並且向外提供一個公有的方法,直接返回太物件。
由於方法語句只有一句,所以不存在鎖的情況
class Single
{private Singel(){}
private static Singel s=new Singel();
public static Singel getInstance()
{
return s;
}
}
懶漢式
所謂懶漢式,就是在初始化的時候並不給該類物件賦值屬性,為null.
只用當呼叫該方法時,進行判斷如果值為null,則新建一個記憶體物件賦值給該物件,返回該物件
否則則認為該物件以存在,返回原來的物件,確保物件的唯一性。
class Single
{private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
s=new Single();
}
return s;
}
}
懶漢式的加鎖情況
由於懶漢式為多行語句,所以線上程執行中可能會造成中斷,生成多個物件的情況。
為了提高程式碼的高效性,所以進行了加鎖以及雙重判斷的情況
第一重判斷,為當不存在該物件時,則增加加鎖程式碼塊,保證程式碼塊中語句不中斷
第二重判斷,如果物件值為null,新建這個物件,提高程式碼的高效性。
class Single
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();}
}
return s;
}
}