实验:
protected void Button1_Click(object sender, EventArgs e)
{
lock (this)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Response.Write(DateTime.Now.ToString());
}
}
}
同时打开多个页面,尽量同时点击button1,发现页面2的打印时间并不是在页面1的打印时间后,也就是说并不是页面1打印完后页面2才开始,也就是lock失效.
如果修改下,就可以实现不同用户http请求的同步访问了:
private static object o=new object()
protected void Button1_Click(object sender, EventArgs e)
{
lock (o)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Response.Write(DateTime.Now.ToString());
}
}
}
因为o是static的,那么在asp.net内也是共享的,生命期跟应用程序一样.
线程的sleep是不释放锁的,而wait是释放锁的.
一般说的多线程是一个请求中(如一个asp.net页面)有多个线程去处理该请求,而不是指asp.net机制是多线程运作的.lock是多线程处理技术中的其中一种.
摘自: http://liquorbin.blog.163.com/blog/static/91156338201093131352212/
探讨了ASP.NET中使用lock(this)的局限性及正确实践。由于ASP.NET为每个HTTP请求实例化一个页面对象,导致lock(this)无法实现预期的线程同步效果。通过使用静态对象作为锁目标,可以有效解决此问题。
260

被折叠的 条评论
为什么被折叠?



