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