如果队列已同步:
var _item = Queue.Synchronized(new Queue());
我可以在不使用锁定语句的情况下调用诸如 Enqueue 和 Dequeue 之类的方法吗?
我当前的代码是:
lock (_item.SyncRoot)
{
_item.Enqueue(obj);
}
我可以线程安全地使用:
_item.Enqueue(obj);
var item = _item.Dequeue();
最佳答案
对Enqueue
的调用和对Dequeue
的调用是线程安全的。
但是,您的示例代码不是:
在调用 Enqueue
和调用 Dequeue
之间可能有一个线程切换。这意味着,item
可能是 obj
之外的另一个实例,或者对 Dequeue
的调用会抛出异常,因为它现在是空的。
为了使您的示例代码线程安全,您仍然需要显式锁定:
lock(_item.SyncRoot)
{
_item.Enqueue(obj);
var item = _item.Dequeue);
}
只有现在可以保证,item
引用在所有情况下都等于 obj
。
关于c# - C#中的队列同步和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6747823/