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

时间:2009-12-09 11:13:39

标签: c# .net locking thread-safety

  

可能重复:
  Difference between lock(locker) and lock(variable_which_I_am_using)

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

3 个答案:

答案 0 :(得分:18)

锁定单独的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);
        }
    }
}

答案 1 :(得分:9)

Jeff Richter(CLR Via C#的作者)在Safe Thread Synchronization的这篇文章中解释了原因。

具体而言,在那篇文章中,“为什么伟大的想法不那么伟大”这一部分回答了你的问题。

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

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

答案 2 :(得分:2)

Eric Gunnerson的博客上有一些很棒的东西。请参阅herehere