亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多線程下的集合安全

2019-11-17 02:52:59
字體:
來源:轉載
供稿:網友

多線程下的集合安全

2014-09-18 10:32 by 遲來的春天, ... 閱讀, ... 評論, 收藏, 編輯

在多線程內使用集合,如果未對集合做任何安全處理,就非常容易出現系統崩潰或各種錯誤。最近的項目里,使用的是socket通信后再改變了某個集合,結果導致系統直接崩潰,且無任何錯誤系統彈出。

經排查,發現問題是執行某集合后,系統就會在一定時間內退出,最后發現是使用的一個字典集合出了問題。稍微思考后,就認定了是線程安全問題。因為此集合在其它幾個地方都有線程做循環讀取。

下面是我模擬的一個示例,沒有進行任何的安全處理:

 1 class PRogram 2     { 3         static MyCollection mycoll; 4         static void Main(string[] args) 5         { 6             mycoll = new MyCollection(); 7             Thread readT = new Thread(new ThreadStart(ReadMethod)); 8             readT.Start(); 9 10             Thread addT = new Thread(new ThreadStart(AddMethod));11             addT.Start();12             Console.ReadLine();13         }14         public static void AddMethod()15         {16             for(int i=0;i<10;i++)17             {18                 Thread.Sleep(500);19                 mycoll.Add("a"+i, i);20             }21         }22         public static void ReadMethod()23         {24             while (true)25             {26                 Thread.Sleep(100);27                 foreach (KeyValuePair<string, int> item in mycoll.myDic)28                 {29                     Console.WriteLine(item.Key + "http://t" + item.Value);30                     //其它處理31                     Thread.Sleep(2000);32                 }33             }34         }35     }36     public class MyCollection37     {38         public Dictionary<string, int> myDic = new Dictionary<string, int>();39 40         public void Add(string key, int value)41         {42             if (myDic.ContainsKey(key))43             {44                 myDic[key] += 1;45             }46             else47             {48                 myDic.Add(key, value);49             }50         }51 52         public void Remove(string key)53         {54             if (myDic.ContainsKey(key))55             {56                 myDic.Remove(key);57             }58         }59     }

在上面的示例中,創建了一個Dictionary字典對像,程序運行時,輸出了下面的錯誤:

程序運行時,輸出了上面的錯誤,僅僅輸出了一行結果

這次測試有明顯示的錯誤提示,集合已修改;可能無法執行枚舉操作。

唉,真是一個常見的問題,在foreach的時侯又修改集合,就一定會出現問題了,因為foreach是只讀的,在進行遍歷時不可以對集合進行任何修改。

看到這里,我們會想到,如果使用for循環進行逆向獲取,也許可以解決此問題。

非??上?,字典對像沒有使用索引號獲取的辦法,下面的表格轉自(http://www.49028c.com/yang_sy/p/3678905.html)

Type內部結構支持索引內存占用隨機插入的速度(毫秒)順序插入的速度(毫秒)根據鍵獲取元素的速度(毫秒)
未排序字典
Dictionary<T,V>哈希表22303020
Hashtable哈希表38505030
ListDictionary鏈表36500005000050000
OrderedDictionary哈希表 +數組59707040
排序字典
SortedDictionary<K,V>紅黑樹20130100120
SortedList<K,V>2xArray2033003040
SortList2xArray274500100180

從時間復雜度來講,從字典中通過鍵獲取值所耗費的時間分別如下:

  • Hashtable, Dictionary和OrderedDictionary的時間復雜度為O(1)
  • SortedDictionary和SortList的時間復雜度為O(logN)
  • ListDictinary的時間復雜度為O(n)

這可如何是好,只能改為可排序的對像?然后使用for解決?

我突然想到,是否可以在循環時縮短foreach,來解決此問題呢?

想到可以在循環時先copy一份副本,然后再進行循環操作,編寫代碼,查找copy的方法。真是無奈,沒有提供任何的copy方法。唉!看來人都是用來被逼的,先改個對象吧:

把Dictionary修改成了Hashtable對像(也沒有索引排序)。代碼如下:

 1  class Program 2     { 3         static MyCollection mycoll; 4         static void Main(string[] args) 5         { 6             mycoll = new MyCollection(); 7             Thread readT = new Thread(new ThreadStart(ReadMethod)); 8             readT.Start(); 9 10             Thread addT = new Thread(new ThreadStart(AddMethod));11             addT.Start();12             Console.ReadLine();13         }14         public static void AddMethod()15         {16             for(int i=0;i<10;i++)17             {18                 Thread.Sleep(500);19                 mycoll.Add("a"+i, i);20             }21         }22         public static void ReadMethod()23         {24             while (true)25             {26                 Thread.Sleep(100);27                 foreach (DictionaryEntry item in mycoll.myDic)28                 {29                     Console.WriteLine(item.Key + "      " + item.Value);30                     //其它處理31                     Thread.Sleep(2000);32                 }33             }34         }35     }36     public class MyCollection37     {38         public Hashtable myDic = new Hashtable();39         40         public void Add(string key, int value)41         {42             if (myDic.ContainsKey(key))43             {44                 45                 myDic[key] =Convert.ToInt32(myDic[key])+ 1;46             }47             else48             {49                 myDic.Add(key, value);50             }51         }52 53         public void Remove(string key)54         {55             if (myDic.ContainsKey(key))56             {57                 myDic.Remove(key);58             }59         }60     }

代碼一如即往的報錯,錯誤信息一樣。使用copy法試試

 1 class Program 2     { 3         static MyCollection mycoll; 4         static void Main(string[] args) 5         { 6             mycoll = new MyCollection(); 7             Thread readT = new Thread(new ThreadStart(ReadMethod)); 8             readT.Start(); 9 10             Thread addT = new Thread(new ThreadStart(AddMethod));11             addT.Start();12             Console.ReadLine();13         }14         public static void AddMethod()15         {16             for(int i=0;i<10;i++)17             {18                 Thread.Sleep(500);19                 mycoll.Add("a"+i, i);20             }21         }22         public static void ReadMethod()23         {24             Hashtable tempHt = null;25             while (true)26             {27                 Thread.Sleep(10
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产中文字幕| 91久久在线视频| 欧洲精品久久久| 成人黄色网免费| 一本大道亚洲视频| 久久精品在线视频| 欧美在线一区二区三区四| 日韩欧美精品免费在线| 亚洲欧美综合v| 日韩精品中文字幕视频在线| 国产精品免费视频xxxx| 欧美电影《睫毛膏》| 国产97免费视| 在线观看欧美日韩| 免费av在线一区| 久久久久久久久久久国产| 国产日本欧美在线观看| 国产成人精品免费久久久久| 韩国精品久久久999| 亚洲国产古装精品网站| 亚洲xxxxx电影| 国产精品第七十二页| 国内精品久久久久影院优| 欧美激情小视频| 欧美性20hd另类| 91po在线观看91精品国产性色| 国产精品视频公开费视频| 欧美午夜精品久久久久久久| 一个人www欧美| 精品国产91乱高清在线观看| 亚洲精品一区久久久久久| 1769国产精品| 欧美成人免费大片| 国内偷自视频区视频综合| 国产女人18毛片水18精品| 国产91免费看片| 亚洲美女在线看| 中文字幕在线视频日韩| 久热在线中文字幕色999舞| 国产成人jvid在线播放| 国内精品中文字幕| 国产精品欧美一区二区三区奶水| 亚洲精品99999| 国产91精品在线播放| 日本精品在线视频| 亚洲精品久久久久久久久久久久| 日韩精品久久久久久福利| 国产欧美日韩综合精品| 亚洲黄色www| 亚洲国产美女久久久久| 亚洲二区在线播放视频| 久操成人在线视频| 欧美激情在线观看| 精品色蜜蜜精品视频在线观看| 91av视频在线免费观看| 中文日韩在线观看| 91亚洲一区精品| 亚洲精品自拍视频| 亚洲精品国产精品国产自| 亚洲精品欧美一区二区三区| 国产精品午夜国产小视频| 欧美一级片免费在线| 亚洲欧美三级在线| 亚洲精品国产精品久久清纯直播| 国产精品一区二区久久久| 26uuu亚洲国产精品| 久久精品国产免费观看| 欧美巨猛xxxx猛交黑人97人| 久久精品国产成人精品| 亚洲视频在线免费观看| 国内精品久久久| 成人黄色在线免费| 日韩av综合网站| 最新69国产成人精品视频免费| 欧美激情手机在线视频| 92版电视剧仙鹤神针在线观看| 日韩免费观看在线观看| **欧美日韩vr在线| 91色视频在线观看| 久久成人国产精品| 国内精品一区二区三区| 日韩在线观看网址| 欧美日本黄视频| 欧美老肥婆性猛交视频| 亚洲精品在线视频| 欧美疯狂xxxx大交乱88av| 欧美日韩中文字幕在线| 亚洲性猛交xxxxwww| 成人免费网视频| 国产一区二区三区四区福利| 国产成人精品电影| 日韩欧美主播在线| 成人国产精品av| 精品人伦一区二区三区蜜桃网站| 午夜精品久久久久久久久久久久| 欧美亚洲国产成人精品| 国产精品爽爽爽爽爽爽在线观看| 亚洲精品成人av| 欧美性猛交xxxx免费看久久久| 欧美日韩国产丝袜另类| 欧美俄罗斯性视频| 亚洲天堂av高清| 欧美精品制服第一页| 精品亚洲一区二区三区在线播放| 91精品久久久久久久久久久| 萌白酱国产一区二区| 91精品国产高清久久久久久久久| 欧美日韩中文字幕综合视频| 日韩中文字幕在线免费观看| 亚洲成人激情视频| 久久人91精品久久久久久不卡| 亚洲精品久久7777777| 久久久精品久久久久| 一区二区国产精品视频| 欧美在线欧美在线| 欧美日韩亚洲精品一区二区三区| 日韩成人激情视频| 日韩精品视频免费| 欧美亚洲成人网| 欧美影院久久久| 亚洲欧美中文日韩在线v日本| 成人免费视频97| 日韩美女视频中文字幕| 成人精品一区二区三区电影黑人| 国产精品高潮呻吟久久av黑人| 97碰在线观看| 日韩av网站大全| 57pao国产成人免费| 在线激情影院一区| 亚洲男人天堂网| 国产精品日日做人人爱| 韩国日本不卡在线| 91精品久久久久久久久不口人| 日韩三级成人av网| 亚洲综合在线小说| 国产精品电影一区| 国产精品av在线| 国产精品午夜视频| 日本欧美一级片| 色综合五月天导航| 有码中文亚洲精品| 日韩高清电影好看的电视剧电影| 国产精品久久久久久久久粉嫩av| 亚洲的天堂在线中文字幕| 亚洲色图15p| 久久青草福利网站| 国产日韩中文字幕在线| 中文字幕日韩精品在线| 国产精品流白浆视频| 欧美电影免费观看电视剧大全| 国内精品久久久久久久久| 最近2019中文字幕mv免费看| 久久人人爽人人爽人人片亚洲| 九九九热精品免费视频观看网站| 国产日韩欧美另类| 午夜欧美不卡精品aaaaa| 热久久免费国产视频| 在线性视频日韩欧美| 美女啪啪无遮挡免费久久网站| 日韩在线视频观看| 国产97在线|亚洲| 国产视频久久久久| 久久久精品久久久久| 欧美二区乱c黑人|