Почему у Collections.Generic.Queue нет метода Synchronized, а у Collections.Queue есть?

System.Collections.Queue класс имеет Queue.Synchronized метод, который возвращает потокобезопасную реализацию очереди.

Но общий, System.Collections.Generic.Queue не имеет Synchronized метод. На данный момент я имею в виду два вопроса:

  1. Почему у общего нет этого метода? Это базовое решение для разработки API?
  2. Как очередь возвращается из Queue.Synchronized отличается от ConcurrentQueue<T> учебный класс?

Благодарю.

1 ответ

Решение

Synchronized() Метод возвращает очередь-оболочку, которая блокирует блокировку каждого метода.
Этот шаблон на самом деле не полезен при написании многопоточных приложений.

Большинство реальных шаблонов использования не принесут пользы для синхронизированных коллекций; им все еще понадобятся блокировки вокруг операций более высокого уровня.

Следовательно Synchronized() методы в System.Collections на самом деле это ловушка, которая приводит людей к написанию не поточно-безопасного кода.


ConcurrentQueue<T> Класс специально разработан для параллельных приложений и содержит полезные методы, которые атомарно изменяют очередь.

Пакет одновременных коллекций содержит только методы, которые имеют смысл использовать в многопоточной среде (например, TryDequeue()); они помогут вам написать код, который на самом деле потокобезопасен.

Это называется ямой успеха.

Для получения дополнительной информации см. Мой блог

Другие вопросы по тегам