Une collection thread-safe par rapport à une collection non threadsafe peut être considérée différemment.
Envisagez un magasin sans commis, sauf à la caisse. Vous avez une tonne de problèmes si les gens n'agissent pas de manière responsable. Par exemple, disons qu'un client prend une canette d'une pyramide pendant qu'un employé est en train de construire la pyramide, tout l'enfer se déchaînerait. Ou, que se passe-t-il si deux clients atteignent le même article en même temps, qui gagne? Y aura-t-il un combat? Il s'agit d'une collection non threadsafe. Il existe de nombreuses façons d'éviter les problèmes, mais elles nécessitent toutes une sorte de verrouillage, ou plutôt un accès explicite d'une manière ou d'une autre.
D'un autre côté, pensez à un magasin avec un commis à un bureau, et vous ne pouvez faire vos achats que par lui. Vous faites la queue et lui demandez un article, il vous le ramène et vous sortez de la file. Si vous avez besoin de plusieurs articles, vous ne pouvez ramasser qu'autant d'articles à chaque aller-retour que vous vous en souvenez, mais vous devez faire attention à ne pas monopoliser le commis, cela mettra en colère les autres clients en ligne derrière vous.
Considérez ceci maintenant. Dans le magasin avec un employé, que se passe-t-il si vous vous rendez jusqu'au bout de la file et demandez au vendeur «Avez-vous du papier toilette», et il dit «Oui», puis vous dites «Ok, je» Je vous recontacterai quand je saurai combien j'ai besoin », puis au moment où vous serez de retour en tête de file, le magasin pourra bien sûr être épuisé. Ce scénario n'est pas empêché par une collection threadsafe.
Une collection threadsafe garantit que ses structures de données internes sont valides à tout moment, même si elles sont accessibles à partir de plusieurs threads.
Une collection non threadsafe n'offre pas de telles garanties. Par exemple, si vous ajoutez quelque chose à un arbre binaire sur un thread, alors qu'un autre thread est occupé à rééquilibrer l'arbre, il n'y a aucune garantie que l'élément sera ajouté, ou même que l'arbre sera toujours valide par la suite, il pourrait être corrompu au-delà de tout espoir.
Une collection threadsafe ne garantit cependant pas que les opérations séquentielles sur le thread fonctionnent toutes sur le même «instantané» de sa structure de données interne, ce qui signifie que si vous avez un code comme celui-ci:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
vous pourriez obtenir une NullReferenceException car entre tree.Count
et tree.First()
, un autre thread a effacé les nœuds restants dans l'arborescence, ce qui signifie First()
que vous retournereznull
.
Pour ce scénario, vous devez soit voir si la collection en question dispose d'un moyen sûr d'obtenir ce que vous voulez, soit vous devez peut-être réécrire le code ci-dessus, soit vous devrez peut-être verrouiller.