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

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

您必须通过锁定或通过例如ReaderWriterLockSlim实现线程安全访问。

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

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

如果您的线程不以任何方式共享数据,那么为什么让它们竞争对同一列表的访问。 这可能是线程本地存储模式的可接受用法。 .NET提供以下机制。

  • Thread.SetDataThread.GetData
  • ThreadStaticAttribute

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

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

 static List _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); } 

添加/删除项目也是如此。

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

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