前言:我知道如何创建一个只读的CultureInfo对象。这不是问题,这里已经详细回答了:
- 文化信息线程安全
请注意,该问题的文本与此类似,但答案完全不同。在考虑将此问题作为另一个问题的副本关闭之前,请考虑以下事实:另一个问题中的任何答案都没有回答这个问题。
我的问题:
访问只读 CultureInfo 对象的实例成员是否线程安全?
假设它是
:如果不是这样,使用
CultureInfo.InvariantCulture
的实例成员或CultureInfo.GetCultureInfo
检索的对象将不是线程安全的,并且许多代码会中断。社区似乎这么认为(参见Henk对此答案的评论),但没有解释原因。
假设它不是的原因:
MSDN 文档中没有此类保证("不保证任何实例成员都是线程安全的。
人们经常混淆"只读"和"线程安全",尽管它们是两个不同的东西。
更改对象时,线程安全是一个问题,因此问题是:您是在更改对象还是在CultureInfo
内部发生了可能更改其状态的某些事情。
MSDN 对此并不是特别清楚:它只是显示有关线程安全的默认通知。
所以我们必须自己找出答案。幸运的是,CultureInfo
类是通过引用源提供的。在那里,您会发现它将在方法开始时加载区域性数据,并将结果缓存在CultureInfo
类中。
属性的初始化不是线程安全的。例如,请参阅 NumberFormat
属性:由于并发调用,它可以实例化两个实例。没有锁定!
在某些地方存在更多问题,例如 NumberFormat
属性,您可以在其中更改其属性。在该类中,它会检查它是否可写,因此如果您使用的是默认区域性(只读区域性,如 InvariantCulture
),则不存在线程安全问题。在所有其他情况下,我们不能假设它是线程安全的。
结论:它们不是线程安全的。