-1

我们都知道下面的代码是用来形成临界区的。

 public class CommonResource
{
    public object obj = new object();

    public void PopularFunction()
    {
        lock (obj)
        {
            ///Access variable that we want to protect form being accessed concurrently 
            ///This forms critical section
            ///My question is what is role'obj' plays in forming critical section.
            ///How it works behind the scene.
        }

        ///Above code can be written as 

        Monitor.Enter(obj);
        ///Access variable that we want to protect form being accessed concurrently 
        ///This forms critical section
        ///My question is what is role'obj' plays in forming critical section.
        ///How it works behind the scene.
        Monitor.Exit(obj);
    }
}

我的问题是 Monitor.Enter 如何在“obj”的帮助下形成一个关键部分。如果我们需要始终传递一个对象,为什么框架不能显式传递任何对象。这背后肯定有什么原因。谁能解释一下?

谢谢,赫曼特

4

2 回答 2

2

您正在传递一个对象以用作锁的标识符。考虑我有以下课程:

public class LockTest
{
    private object obj1 = new object();
    private object obj2 = new object();

    public void Method1()
    {
        lock(obj1)
        {
            ...
        }
    }

    public void Method2()
    {
        lock(obj2)
        {
            ...
        }
    }

    public void Method3()
    {
        lock(obj1)
        {
            ...
        }
    }
}

如果我要从不同的线程调用Method1和调用Method2,则两个调用都不会阻塞另一个调用,因为它们锁定了不同的对象。但是,如果我要从不同的线程调用Method1和,则执行的第一个线程将阻塞另一个线程的执行,直到在块结束时释放锁。Method3lock(obj1)

于 2013-04-08T12:57:20.240 回答
1

使用它是为了让框架知道scope锁的类型。

基本上,您想使用静态对象或非静态对象。

public class Foo
{
    private object sync = new object();
    public void Bar()
    {
        lock (this.sync)
        {
            // You can call new Foo().Bar() multiple times, because
            // each Foo class lock its own instance of the sync object
        }
    }
}

public class Foo
{
    private static object sync = new object();
    public void Bar()
    {
        lock (sync)
        {
            // You can't call new Foo().Bar() multiple times, because
            // each Foo class lock the same instance of the sync object
        }
    }
}
于 2013-04-08T13:00:29.063 回答