2010-11-25 3 views
2

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?

Antwort

2

Public SyncRoot wird im MS-Framework verwendet, das ist richtig, aber das ist eine Instanzeigenschaft, keine statische Eigenschaft. Sie geben keine Details zum Umfang oder zur Verfügbarkeit des von der (Static) SyncRoot-Eigenschaft in Ihrem Beispiel zurückgegebenen syncRoot-Objekts an. Die Dokumentation (http://msdn.microsoft.com/en-us/library/ms173179.aspx) warnt vor dem Sperren eines öffentlichen Typs oder eines Objekts, das "außerhalb der Kontrolle Ihrer Anwendung" liegt. Es gibt eine sehr gute Diskussion über Multithreading unter http://www.albahari.com/threading/.

+0

Guter Punkt. Ich habe die 'statische' Eigenschaft nicht bemerkt. Dies macht es noch gefährlicher, ein solches Sperrkonstrukt öffentlich verfügbar zu machen. – Steven

+0

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

+0

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

0

dies oft für die Sammlung Synchronisation im Rahmen MS verwendet wird

http://msdn.microsoft.com/en-us/library/system.collections.icollection.syncroot.aspx

+1

Dies war das Muster, das Microsoft mit den ersten .NET-Versionen empfohlen hat, aber heutzutage wird es generell davon abgeraten. (Offensichtlich müssen Implementierungen von älteren Schnittstellen wie 'ICollection' dieses Verhalten für Abwärtskompatibilität beibehalten.) – LukeH

1

Die SyncLock ist im Wesentlichen ein Designfehler in dem .NET-Framework. Aus diesem Grund stellen die .NET 2.0-Sammlungen diese Eigenschaft nicht direkt zur Verfügung (sie ist explizit implementiert und aus Gründen der Abwärtskompatibilität erforderlich). Das Problem besteht darin, dass das Sperren häufig zu granular erfolgt, das Sperren auf einem zu niedrigen Niveau erfolgt. In der Regel kann dieses Problem gelöst werden, indem eine Komponente auf höherer Ebene gesperrt wird, die die Sammlung steuert.

Mit der Eigenschaft SyncRoot gibt es tatsächlich Änderungen von Deadlocks, da Sie keine Kontrolle darüber haben, wie die Benutzer dieses gesperrte Objekt verwenden. Sie können auch eine Sperre für eine sehr lange Zeit nehmen oder vergessen, sie zu entsperren. Die Idee von Pause/Resume klingt sehr beängstigend.

Das Übliche ist, die Komponente fadensicher zu machen. Wenn Sie dies tun, benötigen Sie die Eigenschaft SyncRoot nicht.

+0

Guter Punkt. Es scheint, dass die Verriegelung später hinzugefügt wurde, um eine billige Art von Fadensicherheit zu erhalten. – zoidbeck

Verwandte Themen