如果队列已同步:

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

10-07 22:24