第二章面試題2 實現單例模式

2021-08-19 20:11:48 字數 1739 閱讀 6355

什麼是單例模式

singleton:保證乙個類只有乙個例項,且提供乙個訪問它的全域性訪問點

為什麼需要單例模式

有一些類只需要使用乙個例項,如工具箱等

需要實現對唯一例項的受控訪問

怎麼實現單例模式

要求:判斷物件是否被例項化,若例項化了則直接使用例項

是否例項化應該由該類自己判斷,不需要客戶判斷,不允許其他類例項該類,則需要構造方法私有化

客戶通過該類的public方法使用例項

**實現

單執行緒下

//懶漢式——需要時再建立(第一次使用時例項化)

public

class singleton;

public

static singleton getinstance()

return instance;

} }

//餓漢式——一開始就建立好(初始化時建立例項)

public

class singleton;

public

static singleton getinstance()

}

考慮多執行緒

懶漢式:考慮兩個執行緒同時判斷instance是否為空,兩個判斷全部為真,建立兩個例項,執行緒不安全

餓漢式:一開始就建立好,後續部分不進行建立,執行緒安全

比較專案

懶漢式餓漢式

含義第一次使用時建立

類初始化時建立

優勢與劣勢

當不需要時不建立,節約系統資源,執行緒不安全

執行緒安全,浪費系統資源

多執行緒情況

不安全安全

如何改進懶漢式和餓漢式

改進懶漢式

//在第一次使用時建立,且針對例項是否為空加鎖

public

class singleton;

//效果同直接在getinstance方法上加synchronized標籤相同

public

static singleton getinstance()

}return instance;

}}//缺點——當乙個執行緒進入該方法後,其他執行緒都需要等待,效能上有損耗

繼續改進

//雙重校驗鎖——只有當例項為空的時候才進入同步**塊

public

class singleton;

public

static singleton getinstance()}}

}}//為什麼要判斷instance兩次:

//ab執行緒同時判斷instance為空,a進入同步**塊,獲得例項,此時instance為具體引用,b進入同步**塊,若不判斷instance是否為空,則會重新建立乙個新的例項。

改進餓漢式

//使用內部類

public

class singleton

public

static singleton getinstance()

}

//使用列舉類

public enum singleton;

}//使用方法

public

static

void

main(string args)

劍指offer 面試題2 實現單例模式

終於把簡直offer看完了一遍 所以第二遍我決定要美乙個題自己去實現一遍,會加入自己的理解 但是不一定對哈 package t2singleton 餓漢式 author yxx public class singleton private static singleton singleton new...

劍指offer 面試題2 實現單例模式

版本1 餓漢式,在一開始就建立好例項 建構函式私有,使用靜態區域性變數,缺點只能在c 11以上環境中執行 class singleton static singleton getinstance private singleton 或者 class singleton static singleto...

單例設計模式 面試題

設計模式 必須對於多個程式使用同乙個配置資訊物件時,就需要保證其物件的唯一性 如何保證物件的唯一性 不允許其程式new建立物件 在該程式中建立乙個本類例項 對外提供乙個方法讓其他方法可以獲取該物件 2.步驟 私有化該 建構函式 通過new建立乙個在本類物件 定義乙個公有的方法,將建立物件返回.pub...