前言:我知道如何创建只读的CultureInfo对象。这不是问题,这里已经详细解答了:
请注意,该问题的文本与此类似,但答案完全不同。在考虑将此问题视为另一个问题的副本之前,请考虑另一个问题中答案的 none 回答这个问题。
我的问题:
访问只读CultureInfo对象的实例成员是否可以线程安全?
假设它是:
的原因如果不是,使用CultureInfo.InvariantCulture
的实例成员或CultureInfo.GetCultureInfo
检索的对象将不是线程安全的,并且会破坏大量代码。
社区似乎这么认为(见Henk's comment on this answer),但没有解释原因。
假设它不是
的原因在MSDN documentation中没有提出这样的保证("任何实例成员都不保证是线程安全的。" )
人们经常混淆"只读"和"线程安全",虽然they are two different things.
答案 0 :(得分:2)
当您更改对象时,线程安全是一个问题,因此问题是:您是在改变对象还是在CultureInfo
内发生可能会改变其状态的事情。
MSDN对此并不是特别清楚:它只显示有关线程安全的默认通知。
所以我们必须找出自己。幸运的是,CultureInfo
课程通过reference source提供。在那里你会发现它将在方法的开头加载文化数据,并将结果缓存在CultureInfo
类中。
属性的初始化不是线程安全的。例如,参见NumberFormat
property:由于并发调用,它可以实例化两个实例。没有锁定!
某些地方还有更多问题,例如NumberFormat
属性,您可以在其中更改其属性。在该类中,它检查它是否可写,因此如果您使用默认文化(只读文件,如InvariantCulture
),则没有线程安全问题。在所有其他情况下,我们不能假设它是线程安全的。
结论:它们不是线程安全的。