我想知道这是否是有效的锁定。在我的类(class)(这是一个单例)中,我有这行代码:
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 而只是避免使用锁吗?
I am wondering if this code would work?
这取决于Stack
的范围是什么是。如果您要返回堆栈,以便有人可以从外部修改它,请不要将其用作锁。这也意味着 GetCorrectStack
必须是线程安全的,因为 List<T>
不是。
你绝对可以使用ConcurrentStack
而不是为了线程安全。你也可以使用 ConcurrentBag<T>
而不是 List<T>
.请注意,前者是无序的,而后者则相反。
作为旁注 - 如果您使用 GetCorrectStack
通常,它会遍历整个列表,使用 ConcurrentDictionary<TKey, TValue>
可能会更好适用于快速查找。
我是一名优秀的程序员,十分优秀!