为什么没有Collections.Generic.Queue有Synchronized方法但Collections.Queue有?

时间:2013-01-03 23:23:22

标签: c# collections generic-collections concurrent-collections

System.Collections.Queue类有Queue.Synchronized方法,它返回一个线程安全的Queue实现。

但是通用的System.Collections.Generic.Queue没有Synchronized方法。在这一点上,我有两个问题:

  1. 为什么通用的人没有这种方法?它是框架API设计决策吗?
  2. Queue.Synchronized返回的队列与ConcurrentQueue<T>类不同?
  3. 感谢。

1 个答案:

答案 0 :(得分:13)

Synchronized()方法返回一个包装器队列,该队列绕每个方法锁定一个锁 在编写多线程应用程序时,这种模式实际上并不实用。

大多数真实世界的使用模式都不会对同步集合有益;他们仍然需要锁定更高级别的操作。

因此,Synchronized()中的System.Collections方法实际上是一个引导人们编写非线程安全代码的陷阱。


ConcurrentQueue<T>类专为并发应用程序设计,包含以原子方式修改队列的有用方法。

并发集合包只包含在多线程环境中使用的方法(例如TryDequeue());它们将指导您编写实际上是线程安全的代码。

这称为pit of success

有关更多信息,请参阅my blog