2

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

4

2 回答 2

6

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

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 是只读的,但其内部不是线程安全的,那么简单地让多个线程读取它是不安全的。

于 2013-03-24T05:28:39.457 回答
1

为了使并发错误浮出水面,至少一个访问必须是写入/修改访问。

注意不要将 getter 误认为是变量。它们可能会在访问时产生您不知道的影响。

于 2013-03-24T05:15:46.087 回答