Servlet中的线程安全

简介:         Servlet 之所有效率比CGI高,是因为CGI每一个请求都会FORK出一个进程来处理相应的请求,而Servlet则是用线程来处理的,但随之而来就有一个问题:多线程的安全问题!       在Servlet中,类的成员变量是共享的,所有的请求都共用成员变量,为了保证线程安全,我们应该尽量做到如下几点:      1.用方法变量,即局部变量来保存请求中的专有数据,因为每个线程都会有自己的一份局部变量,这样就不会相互影响了。

        Servlet 之所有效率比CGI高,是因为CGI每一个请求都会FORK出一个进程来处理相应的请求,而Servlet则是用线程来处理的,但随之而来就有一个问题:多线程的安全问题!
       在Servlet中,类的成员变量是共享的,所有的请求都共用成员变量,为了保证线程安全,我们应该尽量做到如下几点:
      1.用方法变量,即局部变量来保存请求中的专有数据,因为每个线程都会有自己的一份局部变量,这样就不会相互影响了。
      2.成员变量只保存那些不会改变的数据。道理很简单,因为所有的线程共享一份,如果严格保证只读的话,就不会存在线程间相互影响的情况。
     3.如果有些成员变量可能被修改,但又不得不作为成员变量的时候,请同步访问那些变量
     4.如果访问读写外部资源,那么需要同步访问这些资源
     5.同步的模块越小越好,因为同步以后意味着一次只能有一个线程对访资源进行请求,如果模块太大了必然会影响服务器的效率。
     6.不建议同步services,doGet,doPost方法,因为对这些方法进行同步就意味着一次只能服务一个请求,严重影响服务器性能。
     7.不建议使用SingleThreadModel,该接口只是个标记接口,告诉服务器一次只能有一个线程,缺点和第6条的一样。

    8.如果需要使用频繁变更的成员变量,使用ThreadLocal

目录
相关文章
|
安全 Java 微服务
美团Java研发岗二面:什么叫线程安全?servlet是线程安全吗?
再过一个月的时间就是金九银十了,相信不少的朋友对于已经做好了充足的准备来应对这一次春招,小编对大家也没有太多的建议和帮助,分享一些你们面试上面可以用得到的一些面试题。今天主要给大家分享多线程(线程安全)方面的面试题,看到文章的小伙伴一定要看到后面哦,有海量的面试题分享给大家哟。
|
安全 Java 容器
你能证明Servlet线程不安全吗?
你能证明Servlet线程不安全吗?
200 0
|
XML 安全 Java
漫画 | Servlet属于线程安全的吗?
漫画 | Servlet属于线程安全的吗?
223 0
漫画 | Servlet属于线程安全的吗?
|
存储 安全
Servlet线程安全问题
Servlet线程安全问题(ThreadSafeServlet)
|
应用服务中间件
Servlet的线程不安全问题【使用局部变量是一种解决线程不安全的思路】
Servlet的线程不安全问题【使用局部变量是一种解决线程不安全的思路】
212 0
|
安全 Java 容器
Servlet实例数量到底多少,是否线程安全
通过注解或servlet声明都能控制 servlet 容器如何提供 servlet 实例。
204 0
|
安全 调度 容器
Servlet多线程安全问题
    一,servlet容器如何同时处理多个请求。 Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求。
883 0
|
缓存 安全 Java
聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解一下Java中相关的变量类型以及内存模型JMM。
2119 0