由于lock是System.Threading.Monitor的间接表示,如果我希望直接使用Monitor,我可以获得任何额外的好处。(我读过一篇文章,它建议总是使用Monitor来获得额外的好处。但是没有解释这些好处)
答案 0 :(得分:10)
lock
语句是Monitor类的Enter
和Exit
方法的语法糖。
您仍然可以使用Pulse
和Wait
,如下所示:
lock(x) {
Monitor.Pulse(x);
Monitor.Wait(x);
}
如果您想使用非阻塞TryEnter方法,您必须(至少据我所知)直接使用Monitor。
我不同意你总是使用Monitor
的断言;当您只需要提供它所提供的功能时,lock
关键字很方便。
答案 1 :(得分:5)
好吧,lock
只调用Monitor.Enter
和Monitor.Exit
,所以如果你限制自己lock
,你将无法使用其他有用的功能,例如Monitor.Wait
,Monitor.Pulse
等。否则使用lock
而不是手动使用Monitor.Enter
和Monitor.Exit
并没有任何不利之处, lock
的优势在于它会自动将相应的代码放入try-finally块中。
答案 2 :(得分:3)
Monitor类实现了监视器同步原语:http://en.wikipedia.org/wiki/Monitor_%28synchronization%29。正如你所看到的那样,它不是真正的.Net / C#理念,它广为人知的概念 - 作为任何计算机学位的一部分而被教授。它不仅为您提供了锁定关键部分的能力,还为给定实例提供了内部队列的实现 - 这使得线程之间的交互更加复杂。
关于你应该使用什么,答案通常是完成工作的最简单方法 - 在> 90%的情况下,只使用lock(sth){...}
语法。