我在C#集合中使用了通用队列,但大家都说最好使用System.Collection.Generic.Queue对象,因为它是线程安全的。
请就使用Queue对象做出正确决策,并说明它如何保证线程安全。
我在C#集合中使用了通用队列,但大家都说最好使用System.Collection.Generic.Queue对象,因为它是线程安全的。
请就使用Queue对象做出正确决策,并说明它如何保证线程安全。
if (!collection.IsEmpty) Console.WriteLine(collection[0]);
不行。即使集合是“线程安全的”,这也不意味着这段代码是正确的;另一个线程可能在检查后但在写入行之前将集合清空,因此即使对象据称是“线程安全的”,此代码也可能崩溃。实际上,确定每个相关操作的线程安全性是一个极其困难的问题。线程安全的类型可以在多个线程中被安全地访问,而不用考虑并发问题。通常这意味着该类型是只读的。
有趣的是,Queue<T>
不是线程安全的 - 只要队列没有被修改,它就可以支持并发读取,但这与线程安全不同。
为了思考线程安全,请考虑如果两个线程正在访问一个 Queue<T>
,而第三个线程在添加或删除该队列时会发生什么。由于该类型不限制此行为,因此它不是线程安全的。