<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WizardWu 編程網

      一位臺灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

      博客園 首頁 新隨筆 聯系 訂閱 管理

      一個已上線、用戶龐大的系統,幾個月來第一次出現這個系統錯誤訊息 :

      「已經加入含有相同索引鍵的項目」
      「已添加了具有相同鍵的項」
      An item with the same key has already been added.

      ----------------------------------------------------------------------------
      分析原因:

      C# 的 Dictionary 這種資料結構的變數,若宣告為 static,在使用上,要注意寫入或 Add 資料前,只做 if ContainsKey 判斷是不夠的 (如下圖 2),因其不是「執行緒 ; 線程」(thread) 安全的。由於 Dictionary 的 Key 不能重複,若剛好有兩人或多人,同時進入 if 區塊、同時 Add 同一個 Key,就會引發錯誤。機率不高,但久久偶爾會發生一次。

      因此在 Dictionary 寫入或 Add 前,應多做一個 lock 的動作,如下圖 3,以達到一次只有一個人 (一個執行緒),能進入 lock 區塊中,其他人要排隊等候。

       


      圖 1 宣告 Dictionary 變數



      圖 2 改寫前 (久久偶爾會發生一次錯誤的寫法)



      圖 3 改寫後


      C# 的 lock,但注意一定要是宣告為 static 的變數,才有鎖定的結果 (經我自己實測)。
      (static 變數,表示全網站的所有用戶,共用同一塊「記憶體 ; 內存」(memory),而不是每個用戶各自 new 一塊記憶體)。

      -------------------------------------------------------------------
      Dictionary 介紹 (msdn) :
      https://msdn.microsoft.com/zh-tw/library/xfhwa508(v=vs.110).aspx
      -------------------------------------------------------------------
      詳細說明 Dictionary 問題的文章 (推薦好文,臺灣極資深專家-李明儒先生):
      http://blog.darkthread.net/post-2012-01-31-dictionary-thread-safe.aspx

      以下引用該文的內容:

      Dictionary<TKey, TValue>在多執行緒下,「讀取」沒問題;但若打算在多個執行緒中同時「更新」,就必須自行處理鎖定及同步議題

      上文中,還提到 .NET 4.0 加入一種新的 System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>。
      但我爬文後,覺得不見得能解決此問題,建議勿用。
      -------------------------------------------------------------------
      lock 介紹 :
      http://www.dotblogs.com.tw/yc421206/archive/2011/01/07/20624.aspx
      https://msdn.microsoft.com/zh-tw/library/c5kehkcz.aspx
      -------------------------------------------------------------------
      ConcurrentDictionary<TKey, TValue> 類別 :
      https://msdn.microsoft.com/zh-tw/library/dd287191(v=vs.110).aspx

      ConcurrentDictionary<TKey, TValue>.GetOrAdd 方法 (TKey, TValue) :
      https://msdn.microsoft.com/zh-tw/library/ee378674(v=vs.110).aspx

      Dictionary + Locking versus ConcurrentDictionary
      http://www.codeproject.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar
      -------------------------------------------------------------------
      ConcurrentDictionary 讓你的多線程代碼更優美
      http://www.bkjia.com/C_jc/968538.html

      以下引用該文的內容 (非我本人的觀點):

      用 Dictionary,而當這個屬性被提升為 static 靜態的(類級別的)時候,我們就要考慮它的線程安全性了,因為它有可能被多個線程同時訪問,當然,如果這個對象是只讀的,也無所謂線程安全,但如果這個屬性是可以被寫的,那就需要把它加鎖了。
      但從性能上看,就不能被接收,我們知道,lock 會把其它線程鎖在外面,無論是讀還是寫,都會被鎖,性能非常差。

      -------------------------------------------------------------------

       

      posted on 2015-06-23 13:52  WizardWu  閱讀(5372)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 兴仁县| 精品国精品国自产在国产| 欧美在线精品一区二区三区| 蜜桃无码一区二区三区| 久久99日本免费国产精品| 亚洲欧美日韩在线码| 婷婷丁香五月深爱憿情网| 亚洲人妻系列中文字幕| 亚洲中文一区二区av| 日本免费最新高清不卡视频| 无码人妻精品一区二区三区66| 久久国产成人精品国产成人亚洲| 亚洲国产午夜精品理论片妓女 | 欧洲亚洲成av人片天堂网| 国产第一页浮力影院入口| 日本久久99成人网站| 亚洲精品麻豆一二三区| 好男人社区神马在线观看www | 日本japanese丰满白浆| 亚洲一区二区三区四区| 国产三级精品三级在线观看| 国产真实乱人偷精品人妻| 无码国内精品久久人妻蜜桃| 中文字幕免费不卡二区| 国产成AV人片在线观看天堂无码| 国产无套内射又大又猛又粗又爽| 久久妇女高潮喷水多| 白白发布视频一区二区视频| 国产在线精品欧美日韩电影| 国产精品白丝久久AV网站| 人妻夜夜爽天天爽三区麻豆av| 色综合 图片区 小说区| 精品无码久久久久久尤物| 国产绿帽在线视频看| 大地资源高清播放在线观看| 欧美白妞大战非洲大炮| 少妇激情a∨一区二区三区| 亚洲天堂av 在线| 婷婷丁香五月六月综合激情啪| 亚洲中文字幕无码日韩精品| 亚洲偷自拍国综合|