首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ArrayList/List是线程安全的集合吗?如果不是,你怎么让它线程安全呢?

ArrayList/List是线程安全的集合吗?如果不是,你怎么让它线程安全呢?
EN

Stack Overflow用户
提问于 2014-09-22 15:44:01
回答 6查看 5.8K关注 0票数 0

ArrayList/List是线程安全的集合吗?如果不是,你怎么让它线程安全呢?

EN

回答 6

Stack Overflow用户

发布于 2014-09-22 21:47:33

ArrayList/List不是线程安全集合。我们可以使ArrayList成为线程安全的,如下所示:

代码语言:javascript
运行
复制
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已同步。

票数 6
EN

Stack Overflow用户

发布于 2014-09-22 15:46:04

不,根据msdn的说法

此类型的

公共静态(在Visual Basic中为Shared)成员是线程安全的。不能保证任何实例成员都是线程安全的。

您应该使用并发集合(msdn

BlockingCollection为实现IProducerConsumerCollection的任何类型提供绑定和阻塞功能。

键值对字典的ConcurrentDictionary线程安全实现

先进先出(先进先出)队列的ConcurrentQueue线程安全实现。

后进先出( ConcurrentStack )堆栈的后进先出( LIFO )线程安全实现。

元素无序集合的ConcurrentBag线程安全实现。

IProducerConsumerCollection要在BlockingCollection中使用的类型必须实现的接口。

票数 1
EN

Stack Overflow用户

发布于 2014-09-22 15:46:22

不,他们两个都不是。

使其线程安全的最简单方法是lock对底层集合的所有访问(读和写)。当然,根据您的实际问题,使用另一个线程安全的集合可能会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25968967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档