多线程程序锁定List <stack <person>&gt;的内部堆栈。这样可以吗?

时间:2015-08-26 12:23:17

标签: c# multithreading locking

我想知道这是否有效锁定。 在我的班级(这是一个单身人士)我有这行代码:

private List<Stack<Person>> _persons = List<Stack<Person>>();

我想知道这段代码是否有效?

Stack s = GetCorrectStack();  // pick a stack from the _persons
lock(s)
{
   // do a push or pop on the s stack
}

我问这个,因为关于锁定的所有例子似乎都锁定了类的成员。

而不是像上面那样只使用Stack,我可以使用ConcurrentStack而只是避免使用锁吗?

1 个答案:

答案 0 :(得分:2)

  

我想知道这段代码是否有效?

这取决于Stack的范围。如果您要将堆栈返回到可以从外部修改的堆栈,请不要将其用作锁定。这也意味着GetCorrectStack必须是线程安全的,因为List<T>不是。

您绝对可以使用ConcurrentStack代替线程安全。您也可以使用ConcurrentBag<T>代替List<T>。请注意,前者是无序的,而后者则是无序的。

作为旁注 - 如果您经常使用GetCorrectStack,这会迭代整个列表,那么您最好使用适合快速查找的ConcurrentDictionary<TKey, TValue>。< / p>