ArrayList / List是线程安全集合吗?如果不是,你会如何使其线程安全?
答案 0 :(得分:5)
ArrayList / List不是线程安全集合。我们可以使ArrayList成为一个安全的线程,如:
using System;
using System.Collections;
public class SamplesArrayList
{
public static void Main()
{
// Creates and initializes a new ArrayList. It is thread safe ArrayList
ArrayList myAL = new ArrayList();
myAL.Add( "The" );
myAL.Add( "quick" );
myAL.Add( "brown" );
myAL.Add( "fox" );
// Creates a synchronized wrapper around the ArrayList.
ArrayList mySyncdAL = ArrayList.Synchronized(myAL);
// Displays the sychronization status of both ArrayLists.
Console.WriteLine( "myAL is {0}.", myAL.IsSynchronized ? "synchronized" : "not synchronized" );
Console.WriteLine( "mySyncdAL is {0}.", mySyncdAL.IsSynchronized ? "synchronized" : "not synchronized" );
}
}
此代码生成以下输出。
myAL未同步。 mySyncdAL已同步。
答案 1 :(得分:1)
不,根据msdn:
此类型的公共static(在Visual Basic中为Shared)成员是thread 安全。不保证任何实例成员都是线程安全的。
您应该使用并发集合(msdn)。
BlockingCollection 为实现IProducerConsumerCollection的任何类型提供边界和阻止功能。
<强> ConcurrentDictionary 强> 键值对词典的线程安全实现
<强> ConcurrentQueue 强> 线程安全实现FIFO(先进先出)队列。
<强> ConcurrentStack 强> LIFO(后进先出)堆栈的线程安全实现。
<强> ConcurrentBag 强> 线程安全实现无序的元素集合。
<强> IProducerConsumerCollection 强> 类型必须实现的接口才能在BlockingCollection中使用。
答案 2 :(得分:1)
不,他们都不是。
使其成为线程安全的最简单方法是lock
所有对底层集合的访问(读取和写入)。当然,根据您的实际问题,使用不同的集合(可以是线程安全的集合)可能更好。
答案 3 :(得分:1)
使用reader Writer锁查看我的实现,如果你真的需要一个,但你最好使用Cocurrent API,它们由MS保证
答案 4 :(得分:0)
没有
的列表答案 5 :(得分:0)
您可以使用集合的SyncRoot属性使其线程安全 msdn
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}