SyncRoot

佚名 / 2023-08-04 / 原文

集合都继承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.
    }
}