我有一个Queue<T>
字段,可以被各种线程访问。 Enequeue()
每秒多次从多个线程调用,而有一个单个线程执行Dequeue()
和Count
操作。
到目前为止,我一直没有考虑过这个问题,因为我在使用此队列进行任何操作之前,将它“安全”并在静态对象上使用了lock
。虽然目前没有任何性能问题,但如果它们是多余的,我想摆脱它们。我的问题是:
Queue.Synchronized()
来获取包装器,如果是这样的话:与原始队列相比,这会影响性能吗?答案 0 :(得分:3)
1:是的,他们是必要的;将变异状态排队和出列;标准队列不是线程安全的
2:ConcurrentQueue<T>
可以很好地运作;我个人使用我在这里写的一个版本,Creating a blocking Queue<T> in .NET? - 它可以很容易地限制队列的大小,并且无需循环就可以有效地出列
请注意;对于你当前的实现,如果队列是静态的,那么lock-object应该只是静态的(虽然在问题中不清楚) - 否则所有类似的队列可能都在共享一个锁