Question

J'ai créé une file d'attente synchronisée et je suis en utilisant SyncLock sur la propriété SyncRoot de cette file d'attente lorsque j'invoque les méthodes Enqueue / DEQUEUE. Les méthodes sont invoquées à partir des instances de classes standards producteur / consommateur.

Est-ce une bonne utilisation de la propriété SyncRoot?

Serait-il préférable pratique de créer un objet privé partagé dans chaque classe et verrou sur ce lieu?

S'il vous plaît expliquer votre raisonnement.

Était-ce utile?

La solution

Oui, c'est exactement ce que la propriété est SyncRoot pour. En particulier, cela signifie que si une autre collection « wrapper » est créé, il sera probablement utiliser le même SyncRoot, donc tout le monde peut encore synchroniser correctement.

pourrait créer votre propre objet de verrouillage, et ce serait absolument sûr que personne ne verrouillé d'autre en même temps - mais ce serait aussi dire que tout autre code ne pouvait pas travailler en toute sécurité avec la même collection. Cela dépend vraiment du scénario - est tout autre code capable d'utiliser la même collection? Est-ce autre code sous votre contrôle?

Notez que vous devez prendre un verrou pour tous opérations, non seulement Enqueue / Dequeue. En particulier, si vous voulez itérer sur la collection que vous devez tenir le verrou pour tout ce temps, comme un changement au milieu annulera la iterator.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top