system . collections . queue>线程、锁定和同步
本文关键字:锁定 同步 线程 collections queue system | 更新日期: 2023-09-27 17:52:54
我有一个Queue<T>
字段,由各种线程访问。Enequeue()
被多个线程每秒多次调用,而有一个单个线程执行Dequeue()
和Count
操作。
直到现在我还没有考虑过这个问题,因为我玩它"安全",并使用lock
在一个静态对象与这个队列的任何操作之前。虽然目前没有任何性能问题,但如果锁是冗余的,我希望去掉它们。我的问题是:
- 由于我从未遍历队列,在这种情况下真的需要锁吗?我的意思是,当一个线程在上排队,而第二个线程在上同时排队时,程序会崩溃吗?
- 我是否应该使用
Queue.Synchronized()
来获取包装器,如果是这样:与原始队列相比,这会影响性能吗?
1:是的,他们是必要的;排队和脱队都会改变状态;标准队列不是线程安全的
2: ConcurrentQueue<T>
可以很好地工作;我个人使用的是我在SO上写的一个版本,创建阻塞队列
注意;在您当前的实现中,只有当队列是静态的时,锁对象才应该是静态的(尽管问题中没有明确说明)—否则所有类似的队列可能共享一个锁