Ich überwache eine Subkontraktversorgung einer Softwarekomponente, die eine Netzwerkkommunikation auf niedriger Ebene verwaltet. Mit dieser Komponente bewertet den ich dies gefunden:Öffentlich sichtbares Sperrobjekt: Manchmal nützlich oder Hinweis für Designfehler?
public static object SyncRoot { get { return syncRoot; } }
Innerhalb dieser sehr wichtig Klasse fast jedes Verfahren verwendet dieses Sperrobjekt während Dinge zu tun. Jetzt frage ich mich, ob dies eine gute Entscheidung ist, einen solchen Engpass zu implementieren, oder ist es schließlich ein ernsthafter Konstruktionsfehler. Ist das nicht eine seltsame Art von Multithreading?
Neben dem Problem der möglichen Deadlocking ist Verriegelung schnell? Wie hoch ist der Überwachungseffekt, um alle diese konkurrierenden Threads zu verwalten? Wäre es nicht besser (wenn es irgendwie notwendig wäre), etwas wie eine synchrone Pause/Resume-Methode zu implementieren, um diese Klasse von außen zu starten? In welcher Situation ist ein öffentlich sichtbares Lock-Objekt nützlich? Gibt es irgendwelche?
Guter Punkt. Ich habe die 'statische' Eigenschaft nicht bemerkt. Dies macht es noch gefährlicher, ein solches Sperrkonstrukt öffentlich verfügbar zu machen. – Steven
Wenn andererseits die zu schützende Ressource statisch verfügbar ist, wäre es sinnvoll, ein statisches Sperrobjekt zu haben. Betrachten Sie beispielsweise mehrere Instanzen einer Klasse, die jeweils in einem eigenen Thread ausgeführt werden, und sperren Sie ein privates nicht statisches Feld, bevor Sie in die Konsole schreiben. Die Sperren werden nicht blockiert, und die Konsolenausgabe wird durcheinander gebracht. – phoog
Phoog ich denke, dein erster Gedanke war richtig. Es riecht und die Warnung in der Dokumentation sagt alles. Statisch - okay; öffentlich - zumindest irgendwie in Ordnung, aber gefährlich; öffentlich und statisch - auf keinen Fall. + 1 für den Albahari-Link. – zoidbeck