《單例模式》你需要注意的問題

2022-03-07 06:09:26 字數 1732 閱讀 7438

單例模式大家都很熟悉,但是使用過程中,稍微不注意就會出現大問題。

單例模式:該類在整個系統生命週期中有且只有乙個例項。

單例的建立:

注意問題:

建構函式 私有化 :保證 例項化該類通過統一的介面

提供乙個統一的介面獲取類的例項

保證執行緒同步

例如:public

class

commonquery

object

alocker 

=new

object

();static

readonly

commonquery _cmquery 

=null

;public

static

commonquery getcommonquery()

lock

(alocker)

}return

_cmquery;

}}單例中應該避免的問題:

避免無限遞迴呼叫

盡量少將資料或其他類的例項儲存到該單例類中的全域性變數中(如果有必要除外)

以上2點問題主要針對記憶體的問題,因為單例是在整個系統生命週期中都一直存在,如果有大量資訊被單例儲存,可想而知,我們的記憶體傷不起啊,

導致的結果就是 記憶體溢位!

場景:

多工定時採集某**資料

該需求 核心我一般這麼設計:至少2個類

commonquery:單例,負責 採集任務初始化、執行緒控制、具體採集任務排程、採集結果/錯誤等後續處理、通知前端ui

webworker:非單例,負責具體採集任務,執行結果將反饋給commonquery

核心序列圖:

核心類圖:

基本上核心 就是上面2個類,

執行流程是:在commonquery中的 start()方法中,生成n個(根據多執行緒需要)webworker物件,執行具體任務,當該任務執行完成或者出錯以後,便通過事件efinished或者eerror來

通知commonquery,此時commonquery 根據實際情況來處理是繼續新建任務來執行,還是判斷整個任務結束,通知前台ui。(整個過程採用多執行緒非同步)

注意點:

在commonquery中 不需要儲存任何webworker例項!應該在start()方法裡面去new webworker物件

在webworker的efinished/eerror事件處理中(在commonquery中處理),千萬別呼叫新的一輪採集任務的開始!(此時造成無限遞迴!灰常危險!!)

檢查commonquery,儘量減少將變數儲存下來

這幾點主要針對記憶體的建議,一般這種採集任務執行時間都較長,有時候需要連續幾天不停的採集,此時如果設計的有問題,出現以上3中情況,呵呵,您的記憶體傷不起啊。。。

c#技術交流: 64913828

你需要記住的單例模式

單例模式有很多種實現方式,網上資料也有很多,什麼列舉型 餓漢型 懶漢型 靜態內部型別等等,實現方式很多,不便於記憶。我總結了一下,你需要記住兩種型別,即執行緒安全型和非執行緒安全型。如有瑕疵,望不吝賜教。執行緒安全型 public class singletonthreadsafe public s...

需要注意的問題

決策樹id3和c4.5的差別?各自優點?boost演算法 cart 回歸樹用平方誤差最小化準則,分類樹用基尼指數最小化準則 gbdt與隨機森林演算法的原理以及區別。優化演算法中常遇到的kkt條件?作用是?最近鄰演算法knn 分類與回歸 l1和l2函式?l1和l2正則項的比較,如何解決 l1 求導困難...

單例模式的基本原理以及需要注意的點

public class singleton 關鍵點0 建構函式是私有的 private static singleton single null 關鍵點1 宣告單例物件是靜態的 private static object obj new object public static singleton...