我发现你可以调用Queue.Synchronize来获取一个线程安全的队列对象,但是在Queue<T>上却没有同样的方法。有人知道为什么吗?这看起来有点奇怪。
ConcurrentQueue<T>
,如此文档所述:http://msdn.microsoft.com/en-us/library/dd267265.aspx。值得注意的是它的IsSynchronized方法(正确地)返回false。
ConcurrentQueue<T>
是从头开始完全重写的,创建队列的副本进行枚举,并使用高级无锁技术,例如Interlocked.CompareExchange()
和Thread.SpinWait()
。if (queue.Count > 0) {
object obj = null;
try {
obj = queue.Dequeue();
开发人员在调用Dequeue之前可能没有意识到Count可能已被另一个线程更改。private static object lockObjForQueueOperations = new object();
关于拥有队列实例的类...
通常来说,后一种方法是最安全的,因为它避免了一些常见的陷阱:
正如他们所说,线程很难处理,让它看起来容易可能会带来危险。
Queue<T>
与ConcurrentQueue<T>
作为示例。)ConcurrentQueue<T>
在 System.Collections.Concurrent 中
我猜你指的是第二个问题是关于Queue<T>的吧。
我无法具体回答这个问题,除了IsSynchronized和SyncRoot属性(但不包括Synchronise()方法)是从ICollection接口继承而来的。没有任何泛型集合使用它们,而ICollection<T>接口也不包括SyncRoot。
至于为什么它没有被包含在内,我只能推测它们可能没有按照库设计者预期的方式使用,或者它们根本没有被足够地使用以证明在新的集合中保留它们的必要性。