SyncRoot
繁杂的接口含义
Collection<T> : IList<T>, ICollection<T>, IEnumerable<T>
ICollection 强调是集合,是用来盛放东西的,具有Add(item)、Remove(item)、Contains(item)、Count,API的特点是参数都是元素类型的实例。
Ilist 强调的是集合是线性结构。object this[int idex], IndexOf(item), RemoveAt(index), Insert(int index, object item),API的特点是索引。
IEnumerable 强调的是对外提供遍历集合中所有元素的能力,不管容器内部的元素是横着放的竖着放的还是到处乱扔的。
只要继承了IList接口的集合都是线性数据结构,可以简单的认为是单链表或数组。
集合都继承ICollection====,
集合内部都有一个占用内存真实存放元素的底层容器,然后集合再提供一些操作此内部容器的API。假设我们想让这些API线程安全的访问容器,会定义一个object实例结合lock封装这些外围API。为了性能,不可能让容器都天生线程安全,但是集合都实现ICollection接口,此接口规定集合内部有个SyncRoot引用实例。这样我们再想线程安全的访问容器时,先调用lock(SyncRoot)即可。每个集合都拥有自己的SyncRoot,且与集合捆绑在一起,加锁时不会锁错作为锁的引用实例。
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
// Some operation on the collection, which is now thread safe.
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}