我有一个静态列表,将被不同的线程访问,每个线程都会向列表中添加、读取和删除自己独特的项目。我想知道是否需要担心使这个变量线程安全,因为即使相同的列表对象在线程之间共享,它们也只修改自己独特的项目。
我有一个静态列表,将被不同的线程访问,每个线程都会向列表中添加、读取和删除自己独特的项目。我想知道是否需要担心使这个变量线程安全,因为即使相同的列表对象在线程之间共享,它们也只修改自己独特的项目。
您一定要通过 lock 或 ReaderWriterLockSlim 等方式来实现线程安全访问。
如果您在第一次分配(通过 new)后没有修改 List<> 变量本身,则它是线程安全的,但需要对元素访问进行线程安全控制(因为您说您正在添加/删除列表中的元素,因此更改了其状态)。
顺便说一句,如果线程修改自己的项目,为什么您要共享它们?那么您实现了什么?为什么要这样组织?如果您展示细节,可能会有更好的建议。
只有在更改列表(添加/删除)时才需要担心。但是,如果您正在使用刚获取/添加的对象,则不需要担心(除非它需要在多个线程上使用)。
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);
}
Thread.SetData
和 Thread.GetData
ThreadStaticAttribute
如果您使用的是.NET 4,请尽可能使用提供的并发集合,而不是实现自己的集合。