列表在.NET中的不同线程之间共享

时间:2010-10-24 23:39:32

标签: c# .net multithreading list

我在一个类中有一个静态List,它将被不同的线程访问,每个线程都从列表中添加,读取和删除它自己的唯一项。我想知道我是否要担心这个变量线程安全,因为即使线程之间共享相同的List对象,它们也只修改自己的唯一项目

4 个答案:

答案 0 :(得分:10)

您必须通过lock或通过以下方式实施线程安全访问: ReaderWriterLockSlim

变量本身(List<>)是线程安全的,如果你在第一次分配后没有修改它(通过new),但元素访问必须是线程安全的(因为你说你在列表中添加/删除元素因此改变它的状态)

顺便说一下,如果线程修改了自己的项目,为什么要共享它们呢?那么你实施了什么?你为什么这样组织?如果您显示详细信息,也许有更好的建议。

答案 1 :(得分:2)

如果你的线程没有以任何方式共享数据,那么为什么让他们竞争访问同一个列表。这可能是thread local storage pattern的可接受用法。 .NET提供以下机制。

  • Thread.SetDataThread.GetData
  • ThreadStaticAttribute

或者,如果您可以将线程抽象到自己的自定义类的实例中,然后使用实例变量而不是静态列表变量。

答案 2 :(得分:1)

您只需要担心更改列表(添加/删除)。但是,如果您正在使用刚刚获得/添加的对象,那么您不必担心(除非它需要在多个线程上使用)

static List<ClientState> _clientStates;
static readonly Object _clientStatesLock = new Object();


/// Gets the state of a client for a given Id.
/// Returns null if no state exists.
/// This method is threadsafe.
ClientState GetState (ClientIdentifier id){

    lock (_clientStatesLock)
        return  _clientStates.FirstOrDefault (cs => cs.Id == id);
}

添加/删除项目同样如此。

答案 3 :(得分:1)

如果您使用的是.NET 4,请尽可能使用提供的Concurrent集合,而不是实现自己的。

请参阅http://msdn.microsoft.com/en-us/library/dd997305.aspx