Servlet的线程安全问题
2015-08-23 22:08
302 查看
http://blog.csdn.net/kobejayandy/article/details/9237883
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间
Servlet 体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据 web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行.
ServletRequest:(线程是安全的)
对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
注意:ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
ServletContext:(线程是不安全的)
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet运行环境中,对于一个JSP页只允许有一个servlet的实例在运行和响应所有的页面请求。因此,在结果servlet中所有的成员变量可以被所有的请求所共享,所以只要成员变量没有重新赋值,下次访问该页面时仍然不变。而在<% %>中定义的变量编译成servlet后成service()方法的一个本地变量,而service()方法中的本地变量只能每响应一次请求就重建一次。
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间
Servlet 体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据 web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行.
ServletRequest:(线程是安全的)
对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
注意:ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
ServletContext:(线程是不安全的)
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet运行环境中,对于一个JSP页只允许有一个servlet的实例在运行和响应所有的页面请求。因此,在结果servlet中所有的成员变量可以被所有的请求所共享,所以只要成员变量没有重新赋值,下次访问该页面时仍然不变。而在<% %>中定义的变量编译成servlet后成service()方法的一个本地变量,而service()方法中的本地变量只能每响应一次请求就重建一次。
相关文章推荐
- MySQL中/*!代码 ……*/的使用
- UIlable总结
- vim IDE平台-打造属于自己的配置
- 黑马程序员—学习笔记—接口
- <<如何阅读一本书>>经典摘抄1
- Android xml实现Button背景图片
- Dijkstra算法
- 用两个栈实现一个队列
- bootstrap
- JavaSE复习日记 : 实例化对象/构造方法和this关键字
- iOS中加速度传感器的使用
- mvn学习
- 用 ObjectMapper将JSON字符串转换为java对象时,java对象一定要有无参构造函数
- WedDriver中 如何处理table
- [Android ] 多线程操作中更新UI控件的方法
- tomcat_server.xml配置说明
- Android学习之ImageView放置gif动态图
- cglib动态代理和jdk的动态代理
- 一个网站有很大的访问量,有什么办法来解决?
- C++的 函数模板和模板函数、类模板和模板类区别