2013-03-24 95 views
0

没有任何线程会修改变量。他们都在阅读。这安全吗?多线程读取静态对象是否安全?

+0

相关:http://stackoverflow.com/questions/2076461/how-does-c-sharp-guarantees-the-atomicity-of-read-write-operations – 2013-03-24 05:10:30

+2

取决于变量的类型。 http://blogs.msdn.com/b/ericlippert/archive/2011/05/23/read-only-and-threadsafe-are-different.aspx – 2013-03-24 05:11:48

+0

@PeterRitchie您能详细说明需要指定哪些信息这个问题可以回答? – Kyle 2013-03-24 05:23:11

回答

5

这取决于你的线程正在共享什么资源。请看下面的例子:

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

0

为了出现并发错误,至少有一个访问必须是写入/修改的。

小心不要把getters弄错一个变量。他们可能会有访问时不知道的含义。

+1

死锁是并发错误吗?如果一个或多个读取触发了一个需要锁定的静态构造函数,只有读取才会发生死锁。, – 2013-03-24 05:23:25

+0

好的,我的答案没有考虑死锁,只考虑了竞争条件。 Thx。他们肯定是并发错误! – Sebastian 2013-03-24 05:24:34