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

RCI*_*CIX 17 .net c# locking thread-safety

可能重复:
锁定(锁定器)和锁定之间的差异(variable_which_I_am_using)

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

Joã*_*elo 19

锁定单独的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*Ash 9

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

具体来说,在那篇文章中,"为什么好主意不是那么好"这一部分回答了你的问题.

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

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