小编典典

锁到底如何工作?

c#

我看到对于使用非线程安全的对象,我们使用如下锁将代码包装起来:

private static readonly Object obj = new Object();

lock (obj)
{
    // thread unsafe code
}

因此,当多个线程访问相同的代码(假设它正在ASP.NET Web应用程序中运行)时会发生什么。他们排队了吗?如果是这样,他们将等待多长时间?

使用锁会对性能产生什么影响?


阅读 328

收藏
2020-05-19

共1个答案

小编典典

lock语句由C#3.0转换为以下内容:

var temp = obj;

Monitor.Enter(temp);

try
{
    // body
}
finally
{
    Monitor.Exit(temp);
}

在C#4.0中,此更改已更改,现在生成如下:

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp); 
    }
}

你可以找到什么更多信息Monitor.Enter确实在这里。引用MSDN:

使用Enter以获取作为参数传递的对象上的监视器。如果另一个线程Enter
在对象上执行,但尚未执行Exit,则当前线程将阻塞,直到另一个线程释放对象。同一线程在Enter不阻塞的情况下多次调用是合法的
。但是,Exit必须等待相等数量的 调用,然后等待该对象的其他线程才能解除阻塞。

Monitor.Enter方法将无限期等待;它 不会 超时。

2020-05-19