只读区域性信息对象是否线程安全



前言:我知道如何创建一个只读的CultureInfo对象。这不是问题,这里已经详细回答了:

  • 文化信息线程安全

请注意,该问题的文本与此类似,但答案完全不同。在考虑将此问题作为另一个问题的副本关闭之前,请考虑以下事实:另一个问题中的任何答案都没有回答这个问题。


我的问题:

访问只读 CultureInfo 对象的实例成员是否线程安全?

假设它是

  • 如果不是这样,使用 CultureInfo.InvariantCulture 的实例成员或 CultureInfo.GetCultureInfo 检索的对象将不是线程安全的,并且许多代码会中断。

  • 社区似乎这么认为(参见Henk对此答案的评论),但没有解释原因。

假设它不是的原因:

  • MSDN 文档中没有此类保证("不保证任何实例成员都是线程安全的。

  • 人们经常混淆"只读"和"线程安全",尽管它们是两个不同的东西。

当您

更改对象时,线程安全是一个问题,因此问题是:您是在更改对象还是在CultureInfo内部发生了可能更改其状态的某些事情。

MSDN 对此并不是特别清楚:它只是显示有关线程安全的默认通知。

所以我们必须自己找出答案。幸运的是,CultureInfo类是通过引用源提供的。在那里,您会发现它将在方法开始时加载区域性数据,并将结果缓存在CultureInfo类中。

属性的初始化不是线程安全的。例如,请参阅 NumberFormat 属性:由于并发调用,它可以实例化两个实例。没有锁定!

在某些地方存在更多问题,例如 NumberFormat 属性,您可以在其中更改其属性。在该类中,它会检查它是否可写,因此如果您使用的是默认区域性(只读区域性,如 InvariantCulture),则不存在线程安全问题。在所有其他情况下,我们不能假设它是线程安全的。

结论:它们不是线程安全的。

相关内容

  • 没有找到相关文章

最新更新