我看到对于使用非线程安全的对象,我们使用如下锁将代码包装起来:
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以获取作为参数传递的对象上的监视器。如果另一个线程Enter 在对象上执行,但尚未执行Exit,则当前线程将阻塞,直到另一个线程释放对象。同一线程在Enter不阻塞的情况下多次调用是合法的 。但是,Exit必须等待相等数量的 调用,然后等待该对象的其他线程才能解除阻塞。
Enter
Exit
该Monitor.Enter方法将无限期等待;它 不会 超时。