C# SyncRoot:获取可用于同步对集合的访问的对象

  • Post category:C#

C# SyncRoot

SyncRoot 属性提供了对集合的同步访问的支持,即在多线程环境下加锁,保证在访问集合时不会发生冲突。

定义

public virtual object SyncRoot { get; }

说明

SyncRoot 属性通常用于在循环访问集合元素时实现线程安全操作,如下面的示例所示:

lock (myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // 针对单个item的线程安全逻辑
    }
}

在这个示例中,myCollection.SyncRoot 用于获取同步基元,在获取同步基元时,我们建议使用 lock 语句来防止多个线程同时访问集合,从而导致线程安全问题。

请注意,SyncRoot 只是用于同步访问集合的机制,却不能保证集合内元素的线程安全性。因此,集合内的每个元素的线程安全性都应由程序设计者自行维护。

示例1

下面的示例演示了 SyncRoot 属性的用法:

ArrayList myCollection = new ArrayList();
lock (myCollection.SyncRoot)
{
    myCollection.Add("item1");
}

上面的代码演示了在添加集合元素时同步访问集合的基本用法。

示例2

下面的示例演示了循环访问集合元素时同步访问的用法:

ArrayList myCollection = new ArrayList() { "item1", "item2", "item3" };
lock (myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // 针对单个item的线程安全逻辑
    }
}

上面的代码演示了在循环访问集合元素时同步访问集合的用法。

以上两个示例都展示了 SyncRoot 的用法,其中第一个示例演示了最基本的用法,“添加元素到集合”;第二个示例演示了 “循环访问元素” 时的用法。在这两个示例中,程序员使用 lock 语句和 SyncRoot 属性来保证了多线程环境下访问集合元素的线程安全性。