多线程读取一个静态对象是否安全?

本文关键字:对象 静态 是否 安全 一个 读取 多线程 | 更新日期: 2023-09-27 18:05:46

所有线程都不会修改该变量。他们都在读书。这安全吗?

多线程读取一个静态对象是否安全?

这取决于线程正在共享哪些资源。考虑下面的例子:

public class MyClass
{
    private int i;
    public int Foo { get { return i++; } } 
}
public static class SharedResources
{
    public static const string SharedString;
    public static readonly MyClass SharedMyClass;
}

在这个代码示例中,对SharedString的引用是线程安全的,因为字符串在c#中是只读的。然而,任何线程都可以在任何时候调用SharedResources.SharedMyClass.Foo,并且由于增量不是线程安全的(除非使用Interlocked.Increment),读取此属性的线程可能会得到不一致的结果。

简而言之,如果一个类的公共API是只读的,但是它的内部结构不是线程安全的,那么仅仅让多个线程从它读取就不安全了。

为了使并发性bug出现,至少有一个访问必须是写/修改访问。

注意不要把getter误认为变量。在访问。

时,它们可能有您不知道的含义。