我看到为了使用不是线程安全的对象,我们用这样的锁包装代码:
private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code }
那么,当多个线程访问相同的代码时会发生什么(假设它在 ASP.NET Web 应用程序中运行)。他们在排队吗?如果是这样,他们会等多久?
使用锁对性能有何影响?
该lock语句由 C# 3.0 翻译为以下内容:
lock
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:
Monitor.Enter
用于Enter获取作为参数传递的对象上的 Monitor。如果另一个线程已经Enter 在对象上执行了一个但还没有执行相应Exit的,当前线程将阻塞,直到另一个线程释放该对象。Enter同一个线程在没有阻塞的情况下多次调用是合法的 ;Exit但是,在等待对象的其他线程解除阻塞之前,必须调用相同数量的 调用。
Enter
Exit
该Monitor.Enter方法将无限等待;它 不会 超时。