【发布时间】:2011-04-20 10:11:18
【问题描述】:
注意:我问的是与 3.5 框架相关的问题,因此我没有在 4.0 中包含任何较新的多线程结构(我仍在学习)。
我一直试图对此提出一个答案,以试图结束我一直在争论的问题,但我觉得我没有找到关于会发生什么或可能发生什么的结论性描述在以下场景中。
假设您有一个应用程序具有多个线程,这些线程都在生成对象,每个线程都生成一个唯一的对象。集合(List、Stack 或 Queue)的单个实例是对象创建后的存储库,并且对象在添加到集合后实际上是不可变的。
在此过程中,对集合的唯一操作是添加项目。没有读取、删除或计数。集合中项目的顺序无关紧要。
问题是,如果在各个线程尝试添加对象时集合周围没有锁定,这真的有问题吗?
我说是的,但是几乎所有关于为什么竞争条件有问题的教科书描述都在一端读取,另一端进行竞争,或者写入单个变量,所以我没有足够的证据来证明有效地论证我的观点。
我之所以说“是”,基本上是因为集合并非设计为线程安全的,因此即使只执行“写入”,您也可能会遇到意外或未定义的行为。我猜有两个线程可能会尝试将它们的对象添加到集合中的同一个插槽的风险,因此当它被覆盖时你会丢失一个对象,但我没有找到任何说它是的确实有可能。或者可能存在一些幕后问题,例如当集合需要自行增长以容纳更多项目时。
有人可以向我提供一些信息来帮助平息这个论点吗?我特别想知道是否有任何事情可以证明我错了。
【问题讨论】:
-
“幕后问题,例如当集合需要自行增长以容纳更多项目时”将是我的第一个猜测。
标签: c# multithreading concurrency