前言

事情不太多時,會時不時去看項(xiàng)目中同事寫的代碼可以作個參考或者學(xué)習(xí),個人覺得只有這樣才能走的更遠(yuǎn),抱著一副老子天下第一的態(tài)度最終只能是井底之蛙。前兩篇寫到關(guān)于斷點(diǎn)傳續(xù)的文章,還有一篇還未寫出,后續(xù)會補(bǔ)上,這里我們穿插一篇文章,這是我看到同事寫的代碼中有ConcurrentDictionary這個類,之前并未接觸過,就深入了解了一下,所以算是查漏補(bǔ)缺,基礎(chǔ)拾遺吧,想要學(xué)習(xí)的這種勁頭越有,你會發(fā)覺突然涌現(xiàn)的知識越多,學(xué)無止境!。

話題

本節(jié)的內(nèi)容算是非常老的一個知識點(diǎn),在.NET4.0中就已經(jīng)出現(xiàn),并且在園中已有園友作出了一定分析,為何我又拿出來講呢?理由如下:

(1)沒用到過,算是自己的一次切身學(xué)習(xí)。

(2)對比一下園友所述,我想我是否能講的更加詳盡呢?挑戰(zhàn)一下。

(3)是否能夠讓讀者理解的更加透徹呢?打不打臉不要緊,重要的是學(xué)習(xí)的過程和心得。

在.NET1.0中出現(xiàn)了HashTable這個類,此類不是線程安全的,后來為了線程安全又有了Hashtable.Synchronized,之前看到同事用Hashtable.Synchronized來進(jìn)行實(shí)體類與數(shù)據(jù)庫中的表進(jìn)行映射,緊接著又看到別的項(xiàng)目中有同事用ConcurrentDictionary類來進(jìn)行映射,一查資料又發(fā)現(xiàn)Hashtable.Synchronized并不是真正的線程安全,至此才引起我的疑惑,于是決定一探究竟, 園中已有大篇文章說ConcurrentDictionary類不是線程安全的。為什么說是線程不安全的呢?至少我們首先得知道什么是線程安全,看看其定義是怎樣的。定義如下:

線程安全:如果你的代碼所在的進(jìn)程中有多個線程在同時運(yùn)行,而這些線程可能會同時運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。

一搜索線程安全比較統(tǒng)一的定義就是上述所給出的,園中大部分對于此類中的GetOrAdd或者AddOrUpdate參數(shù)含有委托的方法覺得是線程不安全的,我們上述也給出線程安全的定義,現(xiàn)在我們來看看其中之一。