小编典典

lock 语句在幕后做了什么?

all

我看到为了使用不是线程安全的对象,我们用这样的锁包装代码:

private static readonly Object obj = new Object();

lock (obj)
{
    // thread unsafe code
}

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

使用锁对性能有何影响?


阅读 102

收藏
2022-03-06

共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获取作为参数传递的对象上的 Monitor。如果另一个线程已经Enter
在对象上执行了一个但还没有执行相应Exit的,当前线程将阻塞,直到另一个线程释放该对象。Enter同一个线程在没有阻塞的情况下多次调用是合法的
Exit但是,在等待对象的其他线程解除阻塞之前,必须调用相同数量的 调用。

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

2022-03-06