6

System.Collections.Queue klasa ma metodę Queue.Synchronized, która zwraca wątkową implementację kolejki.Dlaczego funkcja Collections.Generic.Queue nie ma metody zsynchronizowanej, ale funkcja Collections.Queue ma?

Ale ogólny, System.Collections.Generic.Queue nie ma metody Synchronized. W tym momencie mam dwa pytania:

  1. Dlaczego ta metoda nie ma zastosowania generycznego? Czy jest to decyzja dotycząca projektowania interfejsu API?
  2. W jaki sposób kolejka zwrócona z Queue.Synchronized różni się od klasy ConcurrentQueue<T>?

Dzięki.

Odpowiedz

13

Metoda Synchronized() zwraca kolejkę opakowania, która blokuje blokadę wokół każdej metody.
Ten wzór nie jest rzeczywiście przydatny podczas pisania aplikacji wielowątkowych.

Większość rzeczywistych wzorów użytkowania nie przyniesie korzyści dla zsynchronizowanych kolekcji; będą nadal potrzebować zamków wokół operacji na wyższym poziomie.

Dlatego metody Synchronized() w System.Collections są w rzeczywistości pułapką, która prowadzi ludzi do pisania kodu nie będącego wątkiem.


Klasa ConcurrentQueue<T> jest przeznaczony do równoczesnego zastosowania i zawiera użytecznych metod atomowo modyfikują kolejki.

Pakiet kolekcji jednoczesnych zawiera tylko te metody, które mają sens w środowisku wielowątkowym (np. TryDequeue()); pomogą ci napisać kod, który jest w rzeczywistości bezpieczny dla wątków. To jest nazywane pit of success.

o wiele więcej informacji, zobacz my blog

+0

bym naprawdę wdzięczny, jeśli możesz odpowiedzieć na moje pierwsze pytanie powyżej. Dzięki! –

+0

@ahmetalpbalkan: Ponieważ ta metoda jest gorsza niż bezużyteczna. – SLaks