您的位置:首页 > 其它

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()方法中的本地变量只能每响应一次请求就重建一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: