Почему у Collections.Generic.Queue нет метода Synchronized, а у Collections.Queue есть?
System.Collections.Queue
класс имеет Queue.Synchronized
метод, который возвращает потокобезопасную реализацию очереди.
Но общий, System.Collections.Generic.Queue
не имеет Synchronized
метод. На данный момент я имею в виду два вопроса:
- Почему у общего нет этого метода? Это базовое решение для разработки API?
- Как очередь возвращается из
Queue.Synchronized
отличается отConcurrentQueue<T>
учебный класс?
Благодарю.
1 ответ
Synchronized()
Метод возвращает очередь-оболочку, которая блокирует блокировку каждого метода.
Этот шаблон на самом деле не полезен при написании многопоточных приложений.
Большинство реальных шаблонов использования не принесут пользы для синхронизированных коллекций; им все еще понадобятся блокировки вокруг операций более высокого уровня.
Следовательно Synchronized()
методы в System.Collections
на самом деле это ловушка, которая приводит людей к написанию не поточно-безопасного кода.
ConcurrentQueue<T>
Класс специально разработан для параллельных приложений и содержит полезные методы, которые атомарно изменяют очередь.
Пакет одновременных коллекций содержит только методы, которые имеют смысл использовать в многопоточной среде (например, TryDequeue()
); они помогут вам написать код, который на самом деле потокобезопасен.
Это называется ямой успеха.
Для получения дополнительной информации см. Мой блог