91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ConcurrentDictionary多線程同步字典集合的使用方法

發布時間:2020-07-10 14:29:05 來源:億速云 閱讀:2326 作者:Leah 欄目:編程語言

這篇文章運用簡單易懂的例子給大家介紹ConcurrentDictionary多線程同步字典集合的使用方法,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在之前一段時間里面,我的基類多數使用lock和Hashtable組合實現多線程內緩存的沖突處理,不過有時候使用這兩個搭配并不盡如人意,偶爾還是出現了集合已經加入的異常,對代碼做多方的處理后依然如故,最后采用了.NET 4.0后才引入的ConcurrentDictionary多線程同步字典集合,問題順利解決。

1、使用lock和Hashtable組合實現

在我的基類里面,構建業務對象,一般用BLLFactory<T>.Instance就可以獲得對應業務對象的應用了。

var result = BLLFactory<Customer>.Instance.FindFirst();
Console.WriteLine(result.ToJson());

因此使用BLLFactory<T>.Instance這個構建對象后,把它們放到HashTable里面,由于需要設計多線程沖突處理,因此需要使用lock對象來實現鎖定的處理。

HashTable表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用于處理和表現類似key-value的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;value用于存儲對應于key的值。Hashtable中key-value鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對,任何非 null 對象都可以用作鍵或值。

使用這種方式,偶爾在Web端,還是出現多線程訪問沖突的問題,為此我們也可以使用多線程的測試代碼來進行測試重現錯誤,

            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);
            }

跟蹤代碼得到錯誤信息如下所示。

ConcurrentDictionary多線程同步字典集合的使用方法

因此,從上面代碼可以看到,使用lock(syncRoot)也無法出現的多線程沖突問題。

2、使用ConcurrentDictionary替代Hashtable

ConcurrentDictionary是.net4.0推出的一套線程安全集合里的其中一個,和它一起被發行的還有ConcurrentStack,ConcurrentQueue等類型,它們的單線程版本(線程不安全的,Queue,Stack,Dictionary)我們一定不會陌生。ConcurrentDictionary<TKey, TValue> 可由多個線程同時訪問,且線程安全,用法同Dictionary很多相同,但是多了一些方法。ConcurrentDictionary 屬于System.Collections.Concurrent 命名空間。

System.Collections.Concurrent 命名空間提供多個線程安全集合類。當有多個線程并發訪問集合時,應使用這些類代替 System.Collections 和 System.Collections.Generic 命名空間中的對應類型

ConcurrentDictionary這個類提供了下面幾個方法,用于對集合的處理

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來替代Hashtable,我們來看看BLLFactory的類的實現代碼如下所示。

    /// <summary>/// 對業務類進行構造的工廠類/// </summary>/// <typeparam name="T">業務對象類型</typeparam>public class BLLFactory<T> where T : class{//采用ConcurrentDictionary線程安全的集合類來緩存,替代Hashtableprivate static ConcurrentDictionary<string, object> conCurrentCache = new ConcurrentDictionary<string, object>(); /// <summary>/// 創建或者從緩存中獲取對應業務類的實例/// </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); //反射創建,并緩存return bll;
                });
            }
        }
    }

我們可以看到代碼簡化了很多,而且使用前面的多線程測試代碼,也順利獲取數據,不會出現異常了。

ConcurrentDictionary多線程同步字典集合的使用方法

運行代碼可以順利實現,不會出現之前使用Hashtable出現的多線程訪問異常了。

ConcurrentDictionary多線程同步字典集合的使用方法

關于ConcurrentDictionary多線程同步字典集合的使用方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江华| 临武县| 乡城县| 黄龙县| 新巴尔虎右旗| 共和县| 盐津县| 晋江市| 汕头市| 斗六市| 黄平县| 磐安县| 察雅县| 罗城| 通榆县| 两当县| 吉木萨尔县| 衢州市| 巫山县| 元氏县| 昆山市| 巴彦县| 瑞昌市| 桦甸市| 新巴尔虎右旗| 修武县| 永顺县| 桂林市| 大冶市| 巢湖市| 常山县| 房产| 马龙县| 昌邑市| 稷山县| 龙胜| 平邑县| 和顺县| 资源县| 花莲市| 正蓝旗|