在释放它!, Michael Nygard 解释说,许多灾难性的系统故障往往是由一连串的错误引起的。例如,两个线程死锁。现在线程池中的线程减少了两个,因此其他线程上的负载增加,从而增加了死锁的可能性。突然,服务器根本没有响应,因为线程池耗尽,这导致负载均衡器将流量转移到其他服务器(它们都运行相同的代码),这增加了它们发生死锁的可能性。突然整个农场都离线了。
大多数 RDBMS 服务器检测死锁并决定一个“失败者”(一个事务被中止,另一个可以继续)。相比之下,在 C# 中,lock语句将无限期地等待获取锁。
但是,您可以调用Monitor.TryEnter(lockObject, TimeSpan)来请求锁定或超时。如果超时到期并且无法获取锁,则返回 false。有些人将其包装在 using 语句中以保持良好的语法。
所以我的问题是,您是否总是使用超时获取锁?与死锁场景相比,超时会产生哪些问题?