2016-04-21 9 views
0

Vorwort: Ich kann ein schreibgeschütztes CultureInfo-Objekt erstellen. Das ist nicht die Frage, und es wird im Detail hier beantwortet:Sind schreibgeschützte CultureInfo-Objekte Thread-sicher?

Beachten Sie, dass der Wortlaut dieser Frage ist ähnlich wie diese, aber die Antworten sind völlig verschieden. Bevor Sie darüber nachdenken, diese Frage als Duplikat des anderen zu schließen, beachten Sie bitte die Tatsache, dass keine der Antworten in der anderen Frage diese Frage beantwortet.


Meine Frage:

Ist es Thread-sichere Instanz Mitglieder einer für den Zugriff auf Read-Only Cultureinfo-Objekt?

Gründe anzunehmen, dass es ist:

  • Wenn es nicht so wäre, zB Mitglieder von CultureInfo.InvariantCulture oder Objekte, die von CultureInfo.GetCultureInfo abgerufen verwenden würde wäre nicht Thread-sicher, und eine Menge Code brechen .

  • Die Gemeinschaft scheint so zu denken (siehe Henk's comment on this answer), erklärt aber nicht warum.

Gründe anzunehmen, dass dies nicht der Fall: ("Bei Instanz Mitglieder Thread-sicher sein, garantiert nicht" )

+0

Die Dokumentationsseiten enthalten immer einen Hinweis zu [Thread-Sicherheit] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo (v = vs.110) .aspx # Anchor_8) in der Nähe das Ende. Hast du es überprüft? Außerdem ist Thread-Sicherheit nur ein Anliegen, wenn ein Objekt verändert wird. Es ist kein Problem mit schreibgeschützten Objekten oder wenn der einzige Zugriff zum Lesen ist –

+0

* Warum * stellen Sie diese Frage? Hast du ein Problem festgestellt? Wie bei MSDN gibt es * an, dass statische Mitglieder Thread-sicher sind. 'InvariantCulture' * ist * eine statische, wie' GetCultureInfo() '. –

+0

Schließlich, wenn Sie eine bessere Erklärung wollen, nur [den Quellcode überprüfen] ( –

Antwort

2

Thread-Sicherheit ist ein Problem, wenn Sie ein Objekt ändern, also die Frage ist: Ändern Sie das Objekt oder geschieht etwas innerhalb der CultureInfo, die seinen Zustand ändern könnte.

MSDN ist nicht besonders klar darüber: es zeigt nur die Standardmeldung über Thread-Sicherheit.

Also müssen wir uns selbst herausfinden. Zum Glück wird die CultureInfo Klasse durch die reference source zur Verfügung gestellt. Dort finden Sie, dass es die Kulturdaten am Anfang der Methode lädt und dieses Ergebnis in die Klasse CultureInfo zwischenspeichert.

Die Initialisierung von Eigenschaften ist nicht Thread-sicher. Siehe zum Beispiel die NumberFormat property: Es kann zwei Instanzen aufgrund gleichzeitiger Aufrufe instanziieren. Es gibt keine Verriegelung!

Es gibt an einigen Stellen mehr Probleme, zum Beispiel die NumberFormat Eigenschaft, wo Sie ihre Eigenschaften ändern können. Innerhalb dieser Klasse wird überprüft, ob sie beschreibbar ist oder nicht. Wenn Sie also Standardkulturen verwenden (die schreibgeschützten, wie InvariantCulture), gibt es kein Threadsicherheitsproblem.In allen anderen Fällen können wir nicht davon ausgehen, dass es threadsicher ist.

Fazit: Sie sind nicht threadsicher.

+0

Aber es sollte threadsicher sein, sonst, wie das OP darauf hinweist, könnten Sie 'CultureInfo.InvariantCulture' niemals sicher verwenden, da es nur eine Instanz gibt und Sie nie wissen würden, ob ein anderer Thread (vielleicht in einer völlig separaten Klassenbibliothek)) benutzte es. Ich nehme an, Microsoft hätte mit "CultureInfo.InvariantCulture" einen ungeheuerlichen Fehler machen können, aber ich bin mir ziemlich sicher, dass das nicht der Fall war, und der Zugriff darauf ist tatsächlich threadsicher. –

+0

Aber das ist sicher, da Sie seinen Zustand nicht ändern können. Die Hintergrunddaten sind schreibgeschützt. Wenn Sie Ihre eigene 'CultureInfo' erstellen, könnten Sie Probleme mit Multithreading und dem verzögerten Laden von' NumberFormat' bekommen. @MatthewWatson –

+0

Ah ich sehe, Ihre Schlussfolgerung spricht über non-read-only CultureInfo. Ich war verwirrt, weil das OP nur nach schreibgeschützten Einträgen fragte. Um es klar zu sagen, ist Ihre Antwort auf die Frage "Ist es threadsicher, auf Instanzmitglieder eines schreibgeschützten CultureInfo-Objekts zuzugreifen?" "Ja"? –

Verwandte Themen