Frage

Ich habe eine synchronisierte Warteschlange erstellt und bin mit SyncLock auf der SyncRoot Eigenschaft dieser Warteschlange, wenn ich die Enqueue / Dequeue Methoden aufrufen. Die Methoden werden von Instanzen von Standard Producer / Consumer-Klassen aufgerufen.

Ist das eine korrekte Verwendung der SyncRoot Eigenschaft?

Wäre es besser Praxis ein eigenes gemeinsames Objekt in jeder Klasse zu erstellen und erfassen, dass statt?

Bitte erläutern Sie Ihre Argumentation.

War es hilfreich?

Lösung

Ja, das ist genau das, was die SyncRoot Eigenschaft ist für. Insbesondere bedeutet dies, dass, wenn eine andere „Wrapper“ Sammlung erstellt wird, wird es wahrscheinlich den gleichen SyncRoot verwenden, so dass jeder kann noch korrekt synchronisiert werden.

Sie könnte Ihr eigenes Schloss-Objekt erstellen, und das wäre absolut sicher, dass niemand sonst in der gleichen Zeit gesperrt - aber es würde auch bedeuten, dass anderer Code konnte nicht sicher mit der gleichen Kollektion arbeiten. Es hängt wirklich von dem Szenario - ist ein anderer Code Lage, die gleiche Sammlung zu benutzen? Ist der andere Code unter Ihrer Kontrolle?

Beachten Sie, dass Sie eine Sperre herausnehmen sollte alle Operationen, nicht nur Enqueue / Dequeue. Insbesondere dann, wenn Sie über die Sammlung iterieren möchten, sollten Sie die Sperre für die ganze Zeit halten, als eine Änderung in der Mitte der Iterator ungültig wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top