2013-10-18 4 views
5

Ich bin auf der Suche nach einer endgültigen Antwort hier.Sind verschiedene Threads auf verschiedenen Instanzen von JavascriptSerializer oder JavascriptDeserializer Thread sicher

Nach the documentation sind die öffentlichen statischen Methoden von JavascriptSerializer Thread-sicher, aber die nicht-statischen Methoden sind nicht.

Ist sichergestellt, dass für die öffentlichen nicht statischen Methoden dieser Klasse verschiedene Instanzen zum Ausführen unterschiedlicher Threads threadsicher sind (d. H., Es gibt keine privaten statischen Ressourcen, die die Threadsicherheit verletzen könnten)? Es sind vor allem die Methoden zum Serialisieren und Deserialisieren in JavascriptSerializer und JavascriptDeserializer, an denen ich interessiert bin, die aber generell die Antwort wissen möchten.

Wenn Thread A nur auf Instanz A ausgeführt wird und Thread B nur auf Instanz B ausgeführt wird, gibt es eine definitive Garantie für die Threadsicherheit der öffentlichen nicht statischen Methoden in diesem Szenario?

Antwort

5

Zur Wiederholung der Frage: Können diskrete Instanzen von JavaScriptSerializer auf verschiedenen Threads mit maximal einem Thread verwendet werden, der jemals mit einer bestimmten Instanz interagiert?

Ich bin auf der Suche nach einer endgültigen Antwort hier.

Ich kann dir das nicht geben. Wie Sie wahrscheinlich wissen, ist die Thread-Sicherheitsmeldung in der Dokumentation jedoch extrem generisch und erscheint fast überall (eine Ausnahme sind Typen, für die die Nebenläufigkeit verwaltet wird).

Anekdotisch: Mir sind keine Typen bekannt, die freigegebenen internen Status speichern, der nicht Thread-sicher ist. Es ist gleichbedeutend mit der Frage, ob Sie zwei verschiedene Instanzen eines List oder XmlDocument auf zwei verschiedenen Threads verwenden können; der Rahmen wäre ziemlich nutzlos, wenn Sie nicht könnten.

JavaScriptSerializer soll mehrmals in mehreren Threads instanziiert werden, wie ein Webserver es tun wird (ASP.Net Threading ist ziemlich komplex, aber mehrere Instanzen von Typen sind sicherlich erstellt und auf verschiedenen Threads aufgerufen). Das MVC-Framework verwendet intern JavaScriptSerializer, daher ist klar, dass das Team beabsichtigt, es in einer Multi-Thread-Webumgebung zu verwenden.

Eine Schnellansicht der dekompilierten Quelle zeigt keinen gemeinsamen internen Status. Wie @usr feststellt, gibt es keine Garantie für Konsistenz in der internen Implementierung. Es erscheint jedoch sehr unwahrscheinlich, dass sich dies aus den oben genannten Gründen ändert.

Alles in allem wird die JSON.net library oft als eine überlegene Alternative für JSON (de) Serialisierung für seine Leistung und Flexibilität angesehen.

1

Sie sind nicht garantiert Thread-Sicherheit, weil nur die Dokumentation das garantieren kann. Aber das tut es nicht.

Sie können nicht auf Thread-Sicherheit testen. Threading-Fehler treten möglicherweise nur unter Last oder in der Produktion auf.

Auch die Implementierung kann jederzeit geändert werden. Installieren Sie ein Windows Update, Service Pack oder eine neue Version und Ihr Code bricht.

Soweit es mich betrifft, ist dies eine definitive Antwort - Sie können sich nicht darauf verlassen. Ich sehe auch nicht, warum das regelmäßige Erstellen einer neuen Instanz selbst für kleine Datenmengen ein Problem darstellen würde. Die Deserialisierung ist wesentlich rechenintensiver als die Instanziierung eines einzelnen Objekts. Das Erstellen eines (kleinen) Objekts ist extrem günstig.

1

Wenn Typ statischen Privat unsicher

Zustand enthält es ist wie Bombe tickt. Ich nehme an, niemand macht das.