Servlet是线程安全的吗?

资料:

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

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

(2)springmvc中的controller是单例的安全

https://www.cnblogs.com/flywang/p/5483732.html多线程

概括:

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

 

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

以下:post

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都是实例变量,它们都是线程不安全的!url

 

(3)解决办法:spa

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

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

 

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

 

(5)多线程的优势:

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

 

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

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

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

相关文章
相关标签/搜索