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
属性来保证了多线程环境下访问集合元素的线程安全性。