我有一个由多个线程访问的HashTable。例如,让我们看看三个线程:
线程A执行Hash.Insert("a",新对象());
线程B执行Hash.Insert("b",新对象());
线程C执行Hash.Insert("a",新对象());
出于某些原因,我不能在整个哈希上使用锁
我不关心顺序,也不关心进程结束时哪个对象会在散列中。我唯一关心的是不要通过从不同线程更新相同的单元格来获取数据损坏。
我有什么选择?或者这不是一个问题,HashTable自己处理,并保持数据的触觉。
发布于 2012-01-30 08:05:28
您可以考虑使用这样的方法:
ConcurrentDictionary<string, object> Hash = new ConcurrentDictionary<string, object>();
来自System.Collections.Concurrent命名空间。
发布于 2012-01-30 22:50:11
ConcurrentDictionary应该为你工作。它不是免费锁定的,但它不会“锁定整个散列”,除非在某些情况下。
它使用两个集合,一个锁数组和一个哈希桶集合。
锁桶的数量可以通过设置并发级别来控制,哈希桶的初始数量可以通过设置初始容量来控制。(这两个都是构造函数参数)。
锁数组中的每个桶使用一个简单的模块哈希来覆盖几个(至少一个真正的)哈希桶。
并发字典锁定所有锁桶的唯一时间是:
当调整散列桶大小时,
除了调整大小之外,所有这些都很容易避免。
如果可以预测字典中的最大项数,则可以避免调整大小。
https://stackoverflow.com/questions/9060871
复制相似问题