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); }
跟踪代码获得毛病信息以下所示。
因而,从上面代码可以看到,运用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; }); } } }
我们可以看到代码简化了许多,而且运用前面的多线程测试代码,也顺遂猎取数据,不会涌现非常了。
运转代码可以顺遂完成,不会涌现之前运用Hashtable涌现的多线程接见非常了。
以上就是引入ConcurrentDictionary替换Hashtable对多线程的对象缓存处置惩罚,可以顺遂处理题目的时刻,发明其接见效力也是较之前有所提高,一石二鸟。
以上就是运用ConcurrentDictionary多线程同步字典鸠合实例详解的细致内容,更多请关注ki4网别的相干文章!