为什么静态字段通常被视为线程安全?

我是一名.NET和Java开发人员,他对线程相对较新。 我想知道为什么静态字段,静态构造函数等通常被认为是“线程安全的”。

例如,在.NET中构造单例时,使其成为线程安全的一个技巧是使模式的某些组件成为静态。

如果我上述任何假设不正确,请告诉我。

我觉得你很困惑,那些’技巧’不是关于线程,而是避免线程初始化。 因此,如果在应用程序加载时启动某些内容,您不必担心线程在首次请求资源时必须初始化事物,从而避免首先到达那里的线程的竞争条件

您的上述假设不正确。 静态字段不比任何其他字段更安全。

即使在创建单例时,如果有可能同时由多个线程调用,则表示已经构建了对象的标志/指针/项必须受同步原语的保护。

为单例使用静态(类级别)变量的原因是因为您只需要该类的一个对象。 使用对象级变量会将每个对象限制为一个对象而不是每个类一个对象,每个对象一个对象只是一个常规对象:-)

静态构造函数(大多数)是线程安全的,因为运行时在运行它们之前会锁定,从而提供同步。 然而,重新进入仍然是一个问题。

至于“静态字段通常被认为是线程安全的”,我只能说一般的智慧来自少数几个因为无法找到专业开发人员的工作而从事教学工作的白痴,现在又将这些白痴传递给了一群从未有机会学习更好的学生。

静态字段本身并不是线程安全的 – 这是一种谬误。 静态与线程无关。 它只是意味着该字段与类型相关联,而不是类型的实例。 关于静态的线程安全唯一要注意的是它们通常由静态构造函数设置,并且通常是只读的,例如:

 class Foo { // You can safely read `five` from any thread public static readonly int five = 5; } 

但是,这并不会使对象本身具有线程安全性。 这个集合没有任何线程安全:

 class Foo { // You still need to take a lock before writing to this list and probably while reading from it public static readonly List myList = new List; }