【发布时间】:2013-09-14 11:34:14
【问题描述】:
在 C# 中构造函数是否可以被抢占?
例如,考虑代码:
public class A
{
public bool ready = true;
public A()
{
ready = false; // Point #1
// Other initialization stuff
ready = true; // Point #2
}
}
在代码中的其他地方,两个线程可以访问类型 A 的变量,第一个线程调用在点 #1 被抢占的构造函数。然后第二个线程测试ready 并发现它仍然是真的,因此它做了一些坏事。
这种情况可能吗?
更具体地说:
- 构造函数可以被抢占吗?
- 如果有,是不是意味着构造函数中应该有
lock之类的同步代码? - 被构造的对象是不是在构造函数退出后才分配给共享变量,从而完全避开了这个问题?
【问题讨论】:
-
数字 3 是正确的。一个对象的构造函数代码不能超过一个线程。
-
这个问题似乎是错误的。如果你有一个 A 的对象,你不能做 objOfA.A().... 构造函数只在使用 new 关键字创建对象时被调用。一旦创建了对象,就无法在创建的对象上显式调用构造函数。
-
一个对象的构造函数永远不能由多个线程进入(显然所有对象都只构造一次)。
-
@Jon C# 和公开可用的 .NET Framework 类不允许对象多次调用其构造函数(即使它可以从 IL 中调用),但它们确实允许对象不'根本没有调用它们的构造函数。
-
操作系统可以随时抢占任何用户模式代码。它不知道构造函数是什么,也不知道 .NET 是什么。
标签: c# multithreading