您的位置:首页 > 其它

servlet单实例多线程时的线程安全

2013-10-30 11:12 246 查看
  

1、初始化阶段,init方法:负责初始化Servlet对象。
2、提供服务,service方法:负责响应客户的请求。
3、销毁,destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。

servlet不是线程安全的,因为servlet只有一个实例,当有多个请求时,会有该实例的多个线程,而servlet的service等方法没有用synchoronized等同步手段来同步,所以servlet不是线程安全的。

  当第一个用户访问web用户时,servlet实例化。此后有用户访问,web容器均为其创建一个单独的线程来处理用户请求。此时便涉及到线程同步的问题。

    解决线程同步的方法有:

    1.继承SingleThreadModel接口。

         对于不同的容器商对SingleThreadModel的实现不同,分为:

         1)对所有的请求排队,一个一个的响应。

          2)新建servlet的多个实例,以实例池的方式,对外提供服务。

    采用这种方法会使系统的性能大受影响,比较慢。

    2.对service方法里面的代码块进行同步。

    

         public void service(HttpServletRequest request, HttpServletResponse response){

               Synchronized(this){

                   .............

                }

          }

     3.不使用实例变量,使用局部变量。

        1) 实例变量时在堆上分配的,为所有线程共享,所以不是线程安全的

         2)局部变量在栈上分配,由于每个线程都有自己的的执行堆栈,所以是局部安全的


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息