我和队友讨论过锁定.NET.他是一个非常聪明的人,在低级和高级编程方面拥有广泛的背景,但他在低级编程方面的经验远远超过我的.无论如何,他认为,如果可能的话,应该避免在预期会处于重负载的关键系统上进行.NET锁定,以避免"僵尸线程"崩溃系统的可能性很小.我经常使用锁定而且我不知道什么是"僵尸线程",所以我问道.我从他的解释中得到的印象是僵尸线程是一个已经终止但仍然保留在某些资源上的线程.他给出了僵尸线程如何破坏系统的一个例子是一个线程在锁定某个对象后开始一些程序,然后在某个时刻终止锁定才能被释放.这种情况有可能使系统崩溃,因为最终,尝试执行该方法将导致所有线程都在等待访问永远不会返回的对象,因为使用锁定对象的线程已经死亡.
我想我得到了这个的要点,但如果我离开基地,请告诉我.这个概念对我来说很有意义.我并不完全相信这是一个可能在.NET中发生的真实场景.我以前从未听说过"僵尸",但我确实认识到,在较低级别深入工作的程序员往往对计算基础(如线程)有更深入的了解.我肯定看到了锁定的价值,然而,我看到许多世界级程序员利用锁定.我也很有能力为自己评估这个,因为我知道这lock(obj)句话实际上只是语法糖:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
Run Code Online (Sandbox Code Playgroud)
因为Monitor.Enter并且Monitor.Exit被标记了extern.似乎可以想象.NET会做某种处理来保护线程免受可能产生这种影响的系统组件的影响,但这纯粹是推测性的,可能只是基于我从未听说过"僵尸线程"的事实.之前.所以,我希望我能在这里得到一些反馈:
两年多前我问过这个问题.今天发生这种事: