1. 程式人生 > >黑馬程式設計師一單例設計模式的餓漢式與懶漢式以及加鎖的情況

黑馬程式設計師一單例設計模式的餓漢式與懶漢式以及加鎖的情況

------- <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;
}
}