rip*_*234 66 .net c# collections multithreading
当需要线程安全集合(例如Set)时,现在的标准是什么.我自己同步它,还是有固有的线程安全集合?
dtb*_*dtb 99
.NET 4.0 Framework在System.Collections.Concurrent命名空间中引入了几个线程安全的集合:
ConcurrentBag <T>
表示线程安全,无序的对象集合.ConcurrentDictionary <TKey,TValue>
表示可由多个线程同时访问的键值对的线程安全集合.ConcurrentQueue <T>
表示线程安全的先进先出(FIFO)集合.ConcurrentStack <T>
表示线程安全的后进先出(LIFO)集合.
默认情况下,.NET Framework中的其他集合不是线程安全的,需要为每个操作锁定:
lock (mySet)
{
mySet.Add("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
kem*_*002 18
Pre .net 4.0 .Net中的大多数集合都不是线程安全的.你必须自己做一些工作来处理同步:http://msdn.microsoft.com/en-us/library/573ths2x.aspx
文章引用:
可以使用以下任何方法使集合类成为线程安全的:
使用Synchronized方法创建一个线程安全的包装器,并通过该包装器专门访问该集合.
如果类没有Synchronized方法,则从类派生并使用SyncRoot属性实现Synchronized方法.
访问集合时,在SyncRoot属性上使用锁定机制(如C#中的lock语句(Visual Basic中的SyncLock)).
Object thisLock = new Object();
......
lock (thisLock)
{
// Critical code section
}
Run Code Online (Sandbox Code Playgroud)
在.net 4.0中,引入了System.Collections.Concurrent命名空间
阻断收集
并发包
并发队列
并发字典
Ordable分区程序
分区程序
分区程序Ť