• 由asp.net中lock(this)联想到的


    asp.net为每一个http请求从HttpApplication池中取出一个HttpApplication来全程处理每个http请求,从Httpmodule管道到http handle处理.虽然asp.net是以多线程的方式处理请求,但因为每一个请求所对应的httpcontext都不相同,所以是为每一个页面请求实例化了一个该页面类的对象来处理http请求的.如果在asp.net页面中使用lock(this),或者lock(非静态实例成员),每个http请求间不会对lock间的代码进行同步访问,也就是说lock失效.根据上面的分析我们可以知道,既然asp.net 为每一个页面请求实例化一个对象,那么这些lock(this),或者lock(非静态实例成员)中的this,非静态实例成员都是不相同的,所以就无法实现锁的功能.

       实验:

     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/

  • 相关阅读:
    jvm参数陷阱
    concurrent mode failure
    17.Quick QML-SpinBox
    16.Quick QML-ButtonGroup、RadioButton、CheckBox
    15.Quick QML-TextEdit和TextArea
    14.Quick QML-TextInput和TextField详解
    13.Quick QML-RowLayout、ColumnLayout、GridLayout布局管理器介绍、并通过GridLayout设计的简易网站导航界面
    9.qml-property自定义属性
    macOS 系统安装Maven教程
    macOS系统上 为Github 托管项目的访问添加SSH keys
  • 原文地址:https://www.cnblogs.com/ghw0501/p/4733848.html
Copyright © 2020-2023  润新知