C#构造函数是线程安全的吗?

8

假设我有多个线程,每个线程都试图创建同一个类的对象。
在不同的线程中同时创建相同类型的对象会互相干扰吗? 我是否需要在构造函数中使用 "lock" ?

1个回答

19

这很大程度上取决于构造函数的实现方式。

如果构造函数仅访问该类的成员,而不访问任何外部静态类或方法,则是线程安全的。

但是,如果该构造函数正在访问存在于类本身之外的非线程安全对象(如全局单例),则它就不是线程安全的。

更新:构造函数应小心,不要访问非只读或常量的类静态成员。( 感谢Nathan A和LVBen)


4
为了完整起见,我需要更新一下内容,包括如果您没有访问该类的任何静态成员,而不仅仅是“外部静态类或方法”。访问内部静态成员与访问外部静态成员同样不是线程安全的。 - Nathan A
1
类的静态只读和常量成员是可以的。但是,使用其他静态成员时必须小心。 - LVBen
1
const 成员是安全的。 static readonly 成员不一定安全。 首先,您需要确保正确的内存屏障已经放置。 - Servy
Servy,你能解释一下吗? - LVBen
没关系,我做了更多的研究,现在我觉得我可以回答自己的问题了。你可以拥有静态只读成员,它们不是线程安全的,因此使用它们的构造函数也不是线程安全的。 - LVBen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接