我想知道这是否有效锁定。 在我的班级(这是一个单身人士)我有这行代码:
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而只是避免使用锁吗?
答案 0 :(得分:2)
我想知道这段代码是否有效?
这取决于Stack
的范围。如果您要将堆栈返回到可以从外部修改的堆栈,请不要将其用作锁定。这也意味着GetCorrectStack
必须是线程安全的,因为List<T>
不是。
您绝对可以使用ConcurrentStack
代替线程安全。您也可以使用ConcurrentBag<T>
代替List<T>
。请注意,前者是无序的,而后者则是无序的。
作为旁注 - 如果您经常使用GetCorrectStack
,这会迭代整个列表,那么您最好使用适合快速查找的ConcurrentDictionary<TKey, TValue>
。< / p>