Le raccolte presentano problemi di concorrenza specifici. Sono uno sviluppatore .net, ma posso descrivere i problemi in termini abbastanza generali, credo.
Internamente la collezione potrebbe essere implementata in diversi modi. Supponiamo che sia solo una lista collegata.
La raccolta può supportare un numero di operazioni. Aggiungi ed elimina, elimina [indice] e inserisci. Permette anche di iterare sulla collezione.
Quindi hai accesso simultaneo. Ecco alcune situazioni da considerare.
Stai iterando sull'intera collezione. Stai facendo qualcosa di simile (pseudo codice)
per count = 1 per collection.count
fare qualcosa
successivo
Per il gusto di quanto segue, conta attualmente = 5 e collection.count = 10.
Mentre lo fai, fai una delle seguenti azioni. Esegui individualmente ogni scenario:
1) Aggiungi un elemento alla raccolta.
Questo probabilmente funzionerà finché il comportamento è quello di inserire l'elemento alla fine.
2) Inserisci un elemento nella posizione 3
Non male, il conteggio sale di uno, però il nuovo oggetto non sarà incluso nella nostra iterazione.
3) Elimina un elemento nella posizione 3
Ok, ora abbiamo problemi. Count è ora 9 (ricorda che ogni scenario da solo, 1) e 2) non è successo in questo caso). la nostra posizione attuale è ancora 5, ma poiché 3 è stata rimossa, la lista si è spostata a sinistra, ora saltiamo un elemento perché l'elemento 6 è ora l'elemento 5 e stiamo già leggendo 5.
Ma peggiora !!! Immagina le tue cose che stai facendo con l'articolo 5 sta leggendo i membri dell'oggetto nella posizione 5 in base al suo indice.
thread 1 - > collection [5] .element1 = 10
thread 2 - > elimina l'elemento 3
thread 1 - > collection [5] .element2 = 10
in questo momento abbiamo impostato due elementi su diversi elementi.
È ancora peggio nel prossimo.
4) elimina l'elemento 5 mentre si trova attualmente sull'elemento 5.
Sì, rimuovi l'elemento, forse chiama il suo metodo "Dispose" mentre lo rimuovi, ma lo stai ancora trattando come membro attivo della raccolta su un altro thread.
Questo è un caso semplice. Spero che ti dia qualche idea.