为什么静态字段通常被认为是线程安全的

本文关键字:认为是 线程 安全 静态 字段 为什么 | 更新日期: 2023-09-27 18:21:15

我是一名.NET和Java开发人员,对线程技术还比较陌生。我想知道为什么静态字段、静态构造函数等通常被认为是"线程安全的"。

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

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

为什么静态字段通常被认为是线程安全的

我想你会感到困惑,那些"技巧"不是关于线程,而是避免线程初始化。因此,如果某个东西在应用程序加载时初始化,您就不必担心线程在第一次请求资源时必须初始化,从而避免哪个线程首先到达的竞争条件

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

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

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

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

至于"通常被认为是破旧的静态领域",我只能说,一般的智慧来自于少数白痴,他们因为找不到专业开发人员的工作而得到了教学工作,现在又把这种愚蠢的行为传给了一群从未有机会学习得更好的学生。

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

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<Int> myList = new List<Int>; 
}