Вызов Enqueue
и вызов Dequeue
являются потокобезопасными.
Тем не менее, ваш пример кода не является:
Между вызовом Enqueue
и вызовом Dequeue
мог быть переключатель потока. Это означает, что item
может быть другим экземпляром, чем obj
, или вызов Dequeue
вызывает исключение, потому что теперь он пуст.
Чтобы сделать ваш пример кода безопасным, вам все равно необходимо явно заблокировать:
lock(_item.SyncRoot)
{
_item.Enqueue(obj);
var item = _item.Dequeue);
}
Только теперь гарантируется, что item
reference-равно obj
при любых обстоятельствах.