Servlet是线程安全的吗?

资料:

(1)servlet的实例变量是线程不安全的,而其JSP也默认是以多线程方式执行(原创):

https://blog.csdn.net/hunkdong/article/details/443430

(2)springmvc中的controller是单例的

https://www.cnblogs.com/flywang/p/5483732.html

归纳:

(1)Servlet不是线程安全的,因为它采用多线程方式运行其service方法.也就是说,当多个用户并发访问的时候,可能存在线程交互的问题。

 

(2)servlet的实例变量是线程不安全的,而JSP也默认是以多线程方式执行,所以其线程也是不安全的!

如下:

public class SplitPageXmlServlet extends HttpServlet {    
       String pageIndex=request.getParameter("pageIndex");
       String pageSize=0=request.getParameter("pageSize");
       String recordCount=request.getParameter("recordCount");
       public void doPost(HttpServletRequest request, 
                                  HttpServletResponse   response)         
               throws ServletException, IOException {}
}

上面的pageIndex, pageSize, recordCount都是实例变量,它们都是线程不安全的!

 

(3)解决办法:

要解决servlet线程不安全性,其中一个主要的方法就是取消Servlet的实例变量,变成无状态的Servlet。

另外一种方法是对共享数据进行同步操作。使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段。

 

(4)总而言之,凡是在线程内生成的数据对象,都是线程安全的。

 

(5)多线程的优点:

以多线程方式执行可大大降低对系统的 资源需求,提高系统的并发量及响应时间。

 

(6)springmvc的controller与struts2的action的区别

1. springmvc的请求调度器是单Servlet多线程的,其controller默认是单例的,因为controller是以方法参数来接收请求参数的,也就是在线程内声明并接收请求参数的

2. struts2的action是存在实例变量的,即是以action的实例变量来接收请求参数的,所以是线程不安全的,故只能在每个线程内部都创建一个action对象,即action是多实例的

posted @ 2018-10-29 00:45  吴桂鑫  阅读(1125)  评论(0编辑  收藏  举报