ArrayList/List是线程安全的集合吗?如果不是,你怎么让它线程安全呢?
发布于 2014-09-22 21:47:33
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已同步。
发布于 2014-09-22 15:46:04
不,根据msdn的说法
此类型的
公共静态(在Visual Basic中为Shared)成员是线程安全的。不能保证任何实例成员都是线程安全的。
您应该使用并发集合(msdn。
BlockingCollection为实现IProducerConsumerCollection的任何类型提供绑定和阻塞功能。
键值对字典的ConcurrentDictionary线程安全实现
先进先出(先进先出)队列的ConcurrentQueue线程安全实现。
后进先出( ConcurrentStack )堆栈的后进先出( LIFO )线程安全实现。
元素无序集合的ConcurrentBag线程安全实现。
IProducerConsumerCollection要在BlockingCollection中使用的类型必须实现的接口。
发布于 2014-09-22 15:46:22
不,他们两个都不是。
使其线程安全的最简单方法是lock对底层集合的所有访问(读和写)。当然,根据您的实际问题,使用另一个线程安全的集合可能会更好。
https://stackoverflow.com/questions/25968967
复制相似问题