6

System.Collections.Queue classe ha il metodo Queue.Synchronized che restituisce un'implementazione di coda thread-safe.Perché Collections.Generic.Queue non ha il metodo sincronizzato ma Collections.Queue ha?

Ma quello generico, System.Collections.Generic.Queue non ha un metodo Synchronized. A questo punto ho due domande in mente:

  1. Perché non uno generico ha questo metodo? Si tratta di una decisione di progettazione dell'architettura API?
  2. In che modo la coda restituita da Queue.Synchronized è diversa dalla classe ConcurrentQueue<T>?

Grazie.

risposta

13

Il metodo Synchronized() restituisce una coda wrapper che esegue il blocco di un blocco attorno a ciascun metodo.
Questo modello non è effettivamente utile quando si scrivono applicazioni multi-thread.

La maggior parte dei modelli di utilizzo del mondo reale non è vantaggiosa per le raccolte sincronizzate; avranno ancora bisogno di serrature attorno alle operazioni di livello superiore.

Pertanto, i metodi Synchronized() in System.Collections sono in realtà una trappola che porta le persone a scrivere codice non thread-safe.


La classe ConcurrentQueue<T> è specificamente progettato per applicazioni simultanee e contiene metodi utili che modificano atomicamente coda.

Il pacchetto di raccolte simultanee contiene solo metodi che hanno senso utilizzare in un ambiente multi-thread (ad esempio, TryDequeue()); ti aiuteranno a guidare il codice che è effettivamente sicuro per i thread.

Questo è chiamato pit of success.

Per molte più informazioni, vedere my blog

+0

Mi piacerebbe davvero grato se si può rispondere alla mia prima domanda di cui sopra. Grazie! –

+0

@ahmetalpbalkan: Perché questo metodo è peggio che inutile. – SLaks

Problemi correlati