6

System.Collections.Queue类具有Queue.Synchronized返回线程安全队列实现的方法。

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

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

谢谢。

4

1 回答 1

13

Synchronized()方法返回一个包装队列,该队列在每个方法周围都加了一个锁。
在编写多线程应用程序时,这种模式实际上没有用。

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

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


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

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

这被称为成功的坑

有关更多信息,请参阅我的博客

于 2013-01-03T23:27:22.390 回答