只读CultureInfo对象是否是线程安全的?

时间:2016-04-21 10:19:57

标签: c# multithreading globalization cultureinfo

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

请注意,该问题的文本与此类似,但答案完全不同。在考虑将此问题视为另一个问题的副本之前,请考虑另一个问题中答案的 none 回答这个问题。

我的问题:

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

假设它是:

的原因
  • 如果不是,使用CultureInfo.InvariantCulture的实例成员或CultureInfo.GetCultureInfo检索的对象将不是线程安全的,并且会破坏大量代码。

  • 社区似乎这么认为(见Henk's comment on this answer),但没有解释原因。

假设它不是

的原因
  • MSDN documentation中没有提出这样的保证("任何实例成员都不保证是线程安全的。"

  • 人们经常混淆"只读"和"线程安全",虽然they are two different things.

1 个答案:

答案 0 :(得分:2)

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

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

所以我们必须找出自己。幸运的是,CultureInfo课程通过reference source提供。在那里你会发现它将在方法的开头加载文化数据,并将结果缓存在CultureInfo类中。

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

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

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