没有任何线程会修改变量。他们都在阅读。这安全吗?多线程读取静态对象是否安全?
回答
这取决于你的线程正在共享什么资源。请看下面的例子:
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是只读的,但其内部不是线程安全的,那么不安全的只是有多个线程读取它。
为了出现并发错误,至少有一个访问必须是写入/修改的。
小心不要把getters弄错一个变量。他们可能会有访问时不知道的含义。
死锁是并发错误吗?如果一个或多个读取触发了一个需要锁定的静态构造函数,只有读取才会发生死锁。, – 2013-03-24 05:23:25
好的,我的答案没有考虑死锁,只考虑了竞争条件。 Thx。他们肯定是并发错误! – Sebastian 2013-03-24 05:24:34
- 1. 线程安全对象 - 是否静态?
- 2. 静态委托是否线程安全?
- 3. 多线程应用程序中的静态计数器线程是否安全?
- 4. 是静态方法线程安全
- 5. 从多线程读取int是否安全?
- 6. 静态类是否是线程安全的
- 7. 存储在线程安全集合线程中的对象是否安全?
- 8. 是否为线程更新了公共静态变量? (是线程安全的?)
- 9. 这些私有静态成员是否线程安全?
- 10. 公共静态类中的非静态成员是否线程安全?
- 11. 对象成员对于Callable&ExecutorService是否是线程安全的
- 12. 锁(objlocker)是否使该对象线程安全的应用程序广泛?并且静态成员是否自动线程安全?
- 13. 从多个线程写入静态数据实际上是否安全
- 14. 什么是线程安全的对象
- 15. 正在从XmlDocument对象读取线程安全吗?
- 16. Python:安全地读取线程中的对象的值?
- 17. 静态方法和线程安全
- 18. 静态方法和线程安全
- 19. 静态实例线程安全
- 20. SqlServer类静态方法 - 线程安全
- 21. Java静态和线程安全
- 22. Java - 静态方法的线程安全
- 23. 是否mysql_insert_id线程安全?
- 24. 是否log4j线程安全?
- 25. NSPasteboard是否线程安全?
- 26. RegExp.MatchString是否线程安全?
- 27. SeekableStream是否线程安全?
- 28. C#ASP.NET线程安全的静态只读字段
- 29. 线程是否表示线程安全?
- 30. 无状态对象始终是线程安全的?
相关:http://stackoverflow.com/questions/2076461/how-does-c-sharp-guarantees-the-atomicity-of-read-write-operations – 2013-03-24 05:10:30
取决于变量的类型。 http://blogs.msdn.com/b/ericlippert/archive/2011/05/23/read-only-and-threadsafe-are-different.aspx – 2013-03-24 05:11:48
@PeterRitchie您能详细说明需要指定哪些信息这个问题可以回答? – Kyle 2013-03-24 05:23:11