几个月前,我在公司面试一份工作,我没有很强的网络开发背景,但他向我提出的一个问题是,如何改进这段代码。
我不是很清楚地记得代码块,但总结一下,它是一个网页点击计数器,他在点击计数器上使用了锁。
lock(HitCounter)
{
// Bla...
}然而,经过一番讨论后,他说,锁是好的,但永远不要在web应用程序中使用它!
他的声明背后的依据是什么?为什么我不能在web应用程序中使用锁?
发布于 2010-11-30 22:55:26
在web应用程序中不应该使用锁没有特殊的原因。但是,应该小心使用它们,因为它们是一种序列化多线程访问的机制,如果发生锁块争用,多线程访问可能会导致阻塞。然而,这不仅仅是web应用程序的问题。
值得记住的是,在现代硬件上,an uncontended lock takes 20 nanoseconds to flip。考虑到这一点,应该遵循通常的做法,即尝试使锁块内的代码尽可能少。如果代码块中的代码很少,那么开销就会很小,争用的可能性也会很低。
说锁应该永远不使用是一种包罗万象的说法。这真的取决于你的需求是什么,例如,在请求之间共享线程安全的内存缓存可能会比按需从数据库获取的请求阻塞更少。
最后,BCL和ASP.Net框架类型肯定会在内部使用锁,所以您无论如何都是间接地使用它们。
发布于 2010-11-30 22:32:22
应用程序域可能会被回收。
这可能导致旧的appdomain仍然完成对某些请求的服务,而新的appdomain也为新的请求提供服务。
静态变量不在它们之间共享,因此锁定静态全局变量在这种情况下不会授予排他性。
发布于 2010-11-30 22:33:33
首先,您永远不会想要锁定在任何应用程序中实际使用的对象。您希望创建一个锁定对象并锁定该对象:
private readonly object _hitCounterLock = new object();
lock(_hitCounterLock)
{
//blah
}至于问题的web部分,当您锁定时,您会阻止每个试图访问该对象的线程(对于web来说,这些线程可能是成百上千的用户)。它们将一直等待,直到它们前面的每个线程解锁。
https://stackoverflow.com/questions/4314756
复制相似问题