分享
 
 
 

C# 的 Dictionary 寫入前應注意事項

王朝学院·作者佚名  2016-05-20
窄屏简体版  字體: |||超大  

C# 的 Dictionary 寫入前應注意事項一個已上線、用戶龐大的系統,幾個月來第一次出現這個系統錯誤訊息 :「已經加入含有相同索引鍵的項目」「已添加了具有相同键的项」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.aspxhttps://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 ConcurrentDictionaryhttp://www.codePRoject.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar-------------------------------------------------------------------ConcurrentDictionary 让你的多线程代码更优美http://www.bkjia.com/C_jc/968538.html

以下引用該文的內容 (非我本人的觀點):用 Dictionary,而当这个属性被提升为 static 静态的(类级别的)时候,我们就要考虑它的线程安全性了,因为它有可能被多个线程同时访问,当然,如果这个对象是只读的,也无所谓线程安全,但如果这个属性是可以被写的,那就需要把它加锁了。但从性能上看,就不能被接收,我们知道,lock 会把其它线程锁在外面,无论是读还是写,都会被锁,性能非常差。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有