2016-04-21 7 views
0

Предисловие: Я знаю, как создать объект CultureInfo только для чтения. Это не вопрос, и он был дан ответ здесь подробно:Объекты CultureInfo, доступные только для чтения, являются потокобезопасными?

Обратите внимание, что текст этого вопроса похож на этот, но ответы на них совершенно разные. Прежде чем задуматься о том, чтобы закрыть этот вопрос как дубликат другого, учтите тот факт, что нет ответов ответов на другой вопрос.


Мой вопрос:

Это поточно-доступ к членам экземпляра только для чтения CultureInfo объекта?

основания полагать, что это:

  • Если бы это не было, с помощью членов экземпляра из CultureInfo.InvariantCulture или объектов, полученных CultureInfo.GetCultureInfo не поточно-и много коды сломается ,

  • Сообщество, похоже, так думает (см. Henk's comment on this answer), но не объясняет почему.

основание полагать, что это не так: («члены экземпляров не гарантируется поточно» )

+0

Страницы документации всегда содержат примечание о безопасности потоков (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo (v = vs.110) .aspx # Anchor_8) рядом конец. Вы это проверили? Кроме того, безопасность потоков является проблемой только при модификации объекта. Это не проблема с объектами только для чтения или когда единственный доступ для чтения –

+0

* Почему вы задаете этот вопрос? Вы столкнулись с проблемой? Что касается MSDN, он * указывает *, что статические члены являются потокобезопасными. 'InvariantCulture' * является * статическим, как и' GetCultureInfo() '. –

+0

Наконец, если вы хотите получить более подробное объяснение, просто [проверьте исходный код] (http://referencesource.microsoft.com/#mscorlib/system/globalization/cultureinfo.cs) –

ответ

2

Безопасность нити является проблемой при изменении объекта, поэтому возникает вопрос: изменяете ли вы объект или что-то происходит внутри CultureInfo, что может изменить его состояние.

MSDN не особо ясно говорит об этом: он просто показывает уведомление по умолчанию о безопасности потоков.

Итак, нам нужно выяснить сами. К счастью, класс CultureInfo доступен через reference source. Там вы найдете, что он загрузит данные культуры в начале метода, а кеш - результат в классе CultureInfo.

Инициализация свойств не является потокобезопасной. См. Например, NumberFormat property: он может создавать экземпляры двух экземпляров из-за одновременных вызовов. Нет блокировки!

В некоторых местах возникает больше проблем, например, свойство NumberFormat, где вы можете изменить его свойства. Внутри этого класса он проверяет, является ли он доступным для записи, или нет, поэтому, если вы используете культуры по умолчанию (только для чтения, например InvariantCulture), проблема с безопасностью потоков отсутствует.Во всех остальных случаях мы не можем считать, что он потокобезопасен.

Заключение: они не являются потокобезопасными.

+0

Но он должен быть потокобезопасным, иначе, как указывает OP, вы никогда не сможете безопасно использовать 'CultureInfo.InvariantCulture', поскольку есть только один его экземпляр, и вы никогда не узнаете, есть ли другой поток (возможно, в полностью отдельной библиотеке классов) использовал его. Я полагаю, что Microsoft могла бы сделать вопиющую ошибку с 'CultureInfo.InvariantCulture', но я уверен, что они этого не сделали, и доступ к ней действительно является потокобезопасным. –

+0

Но это безопасно, так как вы не можете изменить его состояние. Его резервные данные доступны только для чтения. Если вы создадите свой собственный «CultureInfo», вы можете столкнуться с проблемой многопоточной и ленивой загрузки «NumberFormat», например. @MatthewWatson –

+0

А я вижу, в вашем заключении речь идет о не-только для чтения CultureInfo. Я был смущен, потому что ОП спрашивал только о только для чтения. Чтобы быть ясным, ваш ответ на вопрос «Не потокобезопасно ли обращаться к членам экземпляра объекта CultureInfo только для чтения?» 'Yes'? –

Смежные вопросы