我希望有一个通用的线程安全集合,我看到Arraylist可以很容易地通过其静态Synchronized方法使用线程安全,但是我的错误是这个ArrayList不是通用的所以当我想使用我的对象我总是必须施展它们。有更简单的方法吗?其他列表类型也是可能的。
答案 0 :(得分:3)
如果您在MSDN上阅读有关同步方法的内容,仍然会这样说:
“通过集合枚举本质上不是一个线程安全的过程。即使集合是同步的,其他线程仍然可以修改集合,这会导致枚举器抛出异常。为了保证枚举期间的线程安全,你可以要么在整个枚举期间锁定集合,要么捕获由其他线程所做的更改导致的异常。“
答案 1 :(得分:3)
您可以创建一个List(T)包装器并使用SyncRoot属性同步访问。
MSDN示例:
ICollection ic = ...;
lock (ic.SyncRoot)
{
// Access the collection.
}
答案 2 :(得分:3)
一点知识是危险的;-)是的,你可以使用Meta-Knight的建议并使用SyncRoot
,但你需要小心 - 它不是灵丹妙药。请参阅Microsoft的BCL团队博客中的this post,了解为什么它不像SyncRoot
那么简单。该帖子引用:
我们的通用的一些精明的用户 收藏品观察到我们不再 提供公共
SyncRoot
财产ICollection<T>
和
我认为我们的强迫会更好 人们要更加重视 同步,坦率地说 我们的通用的
SyncRoot
属性 集合不提供任何价值。
当然,这并不是说它在任何情况下都不能使用 - 你只需仔细考虑用例,而不是自动驾驶。