为什么锁在不同的对象上执行?

可能重复:
锁(锁柜)和锁(variable_which_I_am_using)之间的区别

在我见过的所有“线程安全”代码示例中,它们锁定了一个单独的虚拟对象。 为什么不能直接对有问题的数据执行锁定?

锁定单独的private虚拟对象可以保证没有其他人锁定该对象。

如果您锁定数据并且外部可以看到同一条数据,则会失去该保证。 例如:

 public class MyObject { public void SharedMethod() { lock (this) { // Do stuff } } } class Program { static void Main(string[] args) { MyObject o = new MyObject(); lock (o) { new Thread(() => { // Gets blocked 2s because of external lock o.SharedMethod(); }).Start(); Thread.Sleep(2000); } } } 

Jeff Richter(CLR Via C#的作者)在本文中讨论了安全线程同步的原因 。

具体来说,在那篇文章中,“为什么伟大的想法不那么伟大”一节回答了你的问题。

它实际上是CLR Via C#一书中的一章。

总之,将私有对象作为“synclock”对象允许您的类封装和控制您的类所需的任何锁定。 因此,无论有多少客户端使用您的类,都会始终如一地正确执行锁定。

Eric Gunnerson的博客上有一些很棒的东西。 看到这里和这里 。