Ist es eine Leistung, geschachtelte Sperren für dasselbe Objekt zu verwenden?
Sagen wir, wir haben:
%Vor%Ist es in Ordnung, dies "die Leistungsseite" zu tun?
Vielen Dank im Voraus.
Lock hat Kosten, ich schlage vor, dass Sie Ihren Code wie folgt implementieren:
%Vor% lock
ist nicht frei. es hat vor der Rückkehr bestimmte Dinge zu überprüfen. Wie viele Dinge und was zu tun ist, hängt von der Umsetzung ab. Ich würde raten , dass diese Art der Verwendung ist üblich und MS hat einige Optimierung für diesen Anwendungsfall.
Ich würde immer noch empfehlen, dass Sie eine separate Implementierung von AddRange mit allen Dingen haben, die auf einmal gemacht werden. Dies hängt natürlich vom Rest der Klassenschnittstelle ab (gibt es Listener und können sie Nachrichten empfangen, dass mehrere Objekte hinzugefügt wurden usw.).
Dies ist ein ziemlich einfacher Testfall, macht einige Millionen verschachtelte Sperren (was Sie vorschlagen) und dasselbe mit einer anderen Sperre.
Beachten Sie auch die andere mögliche Reihenfolge, wenn Sie eine nicht verschachtelte Sperre verwenden. Möglicherweise erhalten Sie ein Objekt in der Mitte eines Bereichs, den Sie hinzufügen:
%Vor%Bei der Synchronisierung mit einem einzelnen _syncObject kann niemand unterbrechen, da die Sperre bereits von einem anderen Thread gehalten wird.
Ich weiß nicht, wie sich die Leistung auswirkt, aber wenn wir erwarten, dass sich die Leistung verschlechtert, würde ich vorschlagen, dass Sie Ihren Code anders herum implementieren:
%Vor%@AddRange (neues IEnumeratable ({item})): Ich bin kein Syntax-Wizkid, also bitte korrigiert mich, wenn das nicht stimmt!
Tags und Links c# concurrency