如果队列已同步:
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
。