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

2024-01-06

System.Collections.Queue班级有Queue.Synchronized http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized%28v=vs.110%29.aspx返回线程安全的 Queue 实现的方法。

但通用的,System.Collections.Generic.Queue没有Synchronized方法。此时我心中有两个问题:

  1. 为什么通用的没有这个方法呢?这是框架 API 设计决策吗?
  2. 队列是如何返回的Queue.Synchronized http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized%28v=vs.110%29.aspx不同于ConcurrentQueue<T> http://msdn.microsoft.com/en-us/library/dd267265.aspx class?

Thanks.


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

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

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


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

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

这被称为成功的深渊 http://www.codinghorror.com/blog/2007/08/falling-into-the-pit-of-success.html.

有关更多信息,请参阅my blog http://blog.slaks.net/2013-07-22/thread-safe-data-structures

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Collections.Generic.Queue 没有 Synchronized 方法,但 Collections.Queue 有? 的相关文章

随机推荐