欢迎来到天天文库
浏览记录
ID:40547449
大小:19.93 KB
页数:5页
时间:2019-08-04
《ConcurrentDictionary实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ConcurrentDictionary实现.Net4增加的System.Collection.Concurrent线程安全的集合实现,这儿有MS的性能测试报告:Thread-safeCollectionsin.NETFramework4andTheirPerformanceCharacteristics。总的来说效率还是很不错的,为了提高效率用了一些技巧,接口上也多是TryXXX。 ConcurrentDictionary采用Level-Lock方式,和Dictionary一样还是只有一个buckets,只是内部l
2、ock时,采用locknum=key.GetHashcode%lockCount,lock(objects[num]),方式,默认情况下DefaultConcurrencyLevel=4*Environment.ProcessorCount; 也就是4*CPU核心数。相比于一个lockobject,在高并发使用多个lockobject可以很大减少lock等待的可能;但在整个集合操作(如:Count,Clear,Expend..)还是需要全部加锁后操作。 为啥接口都变成TryXXX呢:因为如Add和Remove之间存在
3、竞争,不能再像单线程集合那样简单的抛出异常,不能抛出异常那就得要一个是否操作成功的返回码~ 下面是节点数据结构,算法也有很大的区别,这里使用类,hashtable,Dictionary都用的是struct。问题在于如果使用HashTable双hash算法,对同一个数组就没法做Level啦。Dictionary分别两个数组Bluckets和Entitys,同样无法区分level。至于hash算法比起前两者都要简单不少呢。所以采用了class可以使用m_next连接方式解决冲突,m_ext使用volatile可解决多线程缓存同步问题。
4、来咱来计算一下内存占用问题吧使用class方式无疑对于简单字段要占用多不少内存,就拿int-int来算: Dictionary4*5=20字节/nodeConcurrentDictionary在x64下:8+4+4+4+8+8+8=42字节/node要多占不少内存那。不过对于Node=null时,空位多的时候也能节省部分内存,不过一般空位多了不应该~------ blucket(8)+Node(key(4)+value(4)+hash(4)+next(8)+methodRef(8))+syncblk(8))*有个想法咱吧Dicti
5、onary改造一下位LevelLock,用多个Dict,前面文章有测试效果,还不错。1:privateclassNode//不再是struck了呢2:{3:internalTKeym_key;4:internalTValuem_value;5:internalvolatileNodem_next;//在这儿volatile很重要6:internalintm_hashcode;7:internalnode()8:{9:this.m_key=key;10:this.m_value=value;11:this.m_next=next;1
6、2:this.m_hashcode=hashcode;13:}14:} 下面是Add的实现:1:privateboolTryAddInternal(TKeykey,TValuevalue,boolupdateIfExists,boolacquireLock,outTValueresultingValue)2:{3:inthashCode=this.m_comparer.GetHashCode(key);4:checked5:{6:ConcurrentDictionary.Node[]buckets;7:
7、boolflag;8:while(true)9:{10:buckets=this.m_buckets;11:intnum;12:intnum2;13:this.GetBucketAndLockNo(hashCode,outnum,outnum2,buckets.Length);//计算Hash地址和新的节点落在那个Lock上面14:flag=false;15:boolflag2=false;16:try17:{18:if(acquireLock)19:{20:Monitor.Enter(this.m_locks[num2],ref
8、flag2);21:}22:if(buckets!=this.m_buckets)23:{24:continue;//这儿很重要Enter之前如果不做这个判断,可能因为字段扩容而丢失值25:}26:ConcurrentDictionary
此文档下载收益归作者所有