ArrayList / List是一个线程安全的集合吗?如果不是,你会如何使其线程安全?

时间:2014-09-22 07:44:01

标签: c#

ArrayList / List是线程安全集合吗?如果不是,你会如何使其线程安全?

6 个答案:

答案 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保证

Creating Thread Safe List using Reader Writer Lock

答案 4 :(得分:0)

没有

这是Thread Safe Collections

的列表

答案 5 :(得分:0)

您可以使用集合的SyncRoot属性使其线程安全 msdn

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}