多线程读取一个静态对象是否安全?
本文关键字:对象 静态 是否 安全 一个 读取 多线程 | 更新日期: 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误认为变量。在访问。