ConcurrentDictionary实现

ConcurrentDictionary实现

ID:40547449

大小:19.93 KB

页数:5页

时间:2019-08-04

ConcurrentDictionary实现_第1页
ConcurrentDictionary实现_第2页
ConcurrentDictionary实现_第3页
ConcurrentDictionary实现_第4页
ConcurrentDictionary实现_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。