這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹ConcurrentDictionary多線(xiàn)程同步字典集合的使用方法,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
為白水等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及白水網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、做網(wǎng)站、白水網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
在之前一段時(shí)間里面,我的基類(lèi)多數(shù)使用lock和Hashtable組合實(shí)現(xiàn)多線(xiàn)程內(nèi)緩存的沖突處理,不過(guò)有時(shí)候使用這兩個(gè)搭配并不盡如人意,偶爾還是出現(xiàn)了集合已經(jīng)加入的異常,對(duì)代碼做多方的處理后依然如故,最后采用了.NET 4.0后才引入的ConcurrentDictionary多線(xiàn)程同步字典集合,問(wèn)題順利解決。
在我的基類(lèi)里面,構(gòu)建業(yè)務(wù)對(duì)象,一般用BLLFactory<T>.Instance就可以獲得對(duì)應(yīng)業(yè)務(wù)對(duì)象的應(yīng)用了。
var result = BLLFactory<Customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson());
因此使用BLLFactory<T>.Instance這個(gè)構(gòu)建對(duì)象后,把它們放到HashTable里面,由于需要設(shè)計(jì)多線(xiàn)程沖突處理,因此需要使用lock對(duì)象來(lái)實(shí)現(xiàn)鎖定的處理。
HashTable表示鍵/值對(duì)的集合。在.NET Framework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類(lèi)似key-value的鍵值對(duì),其中key通??捎脕?lái)快速查找,同時(shí)key是區(qū)分大小寫(xiě);value用于存儲(chǔ)對(duì)應(yīng)于key的值。Hashtable中key-value鍵值對(duì)均為object類(lèi)型,所以Hashtable可以支持任何類(lèi)型的keyvalue鍵值對(duì),任何非 null 對(duì)象都可以用作鍵或值。
使用這種方式,偶爾在Web端,還是出現(xiàn)多線(xiàn)程訪(fǎng)問(wèn)沖突的問(wèn)題,為此我們也可以使用多線(xiàn)程的測(cè)試代碼來(lái)進(jìn)行測(cè)試重現(xiàn)錯(cuò)誤,
try{ List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++) { Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson()); Console.WriteLine(); }); list.Add(thread); }for (int i = 0; i < list.Count; i++) { list[i].Start(); } }catch(Exception ex) { LogTextHelper.Error(ex); }
跟蹤代碼得到錯(cuò)誤信息如下所示。
因此,從上面代碼可以看到,使用lock(syncRoot)也無(wú)法出現(xiàn)的多線(xiàn)程沖突問(wèn)題。
ConcurrentDictionary是.net4.0推出的一套線(xiàn)程安全集合里的其中一個(gè),和它一起被發(fā)行的還有ConcurrentStack,ConcurrentQueue等類(lèi)型,它們的單線(xiàn)程版本(線(xiàn)程不安全的,Queue,Stack,Dictionary)我們一定不會(huì)陌生。ConcurrentDictionary<TKey, TValue>可由多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn),且線(xiàn)程安全,用法同Dictionary很多相同,但是多了一些方法。ConcurrentDictionary 屬于System.Collections.Concurrent 命名空間。
System.Collections.Concurrent 命名空間提供多個(gè)線(xiàn)程安全集合類(lèi)。當(dāng)有多個(gè)線(xiàn)程并發(fā)訪(fǎng)問(wèn)集合時(shí),應(yīng)使用這些類(lèi)代替 System.Collections 和 System.Collections.Generic 命名空間中的對(duì)應(yīng)類(lèi)型。
ConcurrentDictionary這個(gè)類(lèi)提供了下面幾個(gè)方法,用于對(duì)集合的處理
public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory) public TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
使用ConcurrentDictionary來(lái)替代Hashtable,我們來(lái)看看BLLFactory的類(lèi)的實(shí)現(xiàn)代碼如下所示。
/// <summary>/// 對(duì)業(yè)務(wù)類(lèi)進(jìn)行構(gòu)造的工廠(chǎng)類(lèi)/// </summary>/// <typeparam name="T">業(yè)務(wù)對(duì)象類(lèi)型</typeparam>public class BLLFactory<T> where T : class{//采用ConcurrentDictionary線(xiàn)程安全的集合類(lèi)來(lái)緩存,替代Hashtableprivate static ConcurrentDictionary<string, object> conCurrentCache = new ConcurrentDictionary<string, object>(); /// <summary>/// 創(chuàng)建或者從緩存中獲取對(duì)應(yīng)業(yè)務(wù)類(lèi)的實(shí)例/// </summary>public static T Instance {get{string CacheKey = typeof(T).FullName;return (T)conCurrentCache.GetOrAdd(CacheKey, s =>{var bll = Reflect<T>.Create(typeof(T).FullName, typeof(T).Assembly.GetName().Name); //反射創(chuàng)建,并緩存return bll; }); } } }
我們可以看到代碼簡(jiǎn)化了很多,而且使用前面的多線(xiàn)程測(cè)試代碼,也順利獲取數(shù)據(jù),不會(huì)出現(xiàn)異常了。
運(yùn)行代碼可以順利實(shí)現(xiàn),不會(huì)出現(xiàn)之前使用Hashtable出現(xiàn)的多線(xiàn)程訪(fǎng)問(wèn)異常了。
關(guān)于ConcurrentDictionary多線(xiàn)程同步字典集合的使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章題目:ConcurrentDictionary多線(xiàn)程同步字典集合的使用方法
標(biāo)題URL:http://jinyejixie.com/article48/pshihp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、定制開(kāi)發(fā)、外貿(mào)建站、ChatGPT、企業(yè)建站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)