Servlet多线程同步问题
由于Servlet/JSP默认为是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程同步问题。
如果在编写Servlet/JSP程序时不注意到多线程同步问题,这往往造成编写的程序在少量用户访问时没有问题,而在并发用户上升到一定值时,就会经常出现一些莫名其妙的问题,对于这类随机性的问题调试难度也将会非常的大。
可能会出现这种情况,在Servlet中创建了一个成员变量,一个线程对这个成员变量进行写操作,而另外一个线程对这个成员变量进行读操作。那我们拿到的数据就可能是不正确的。
所以,不要在Servlet中创建成员变量!也不可能让Servlet在单线程环境下运行,也别去使用同步代码块,因为这样会导致服务器以极低的效率运行服务。
ServletContext
1、ServletContext
概述
当Servlet容器启动Web应用时,会为每一个Web应用创建唯一的ServletContext
对象。我们可以把ServletContext
看成是一个Web应用的服务器端组件的共享内存。
也就是说,我们可以通过ServletContext
对象可以实现不同Servlet之间的数据传输。例如,我们在ServletDemo1
中向ServletContext
对象中存储了一个值,然后在ServletDemo2
中得到这个值,这样我们就是通过ServletContext
对象共享数据了。
2、ServletContext
应用
(1)在使用ServletContext
对象之前,我们需要知道如何拿到这个Web应用中唯一的数据共享容器,我们有两种方式:
-
ServletConfig
中的getServletContext()
方法; -
GenericServlet
中的getContext()
方法;
(2)前面说的ServletContext
对象是可以进行数据共享的,原因是在于ServletContext
对象中存在一个Map
集合,和我们平时使用的Map
特性差不多,都会覆盖其中key
相同的value
值,以下是使用这个Map
的方法:
-
void setAttribute(String name, Object value)
:用来存储一个对象,也可以称之为存储一个域属性; -
Object getAttribute(String name)
:用来获取ServletContext
中的数据,当然,在获取之前需要先存储这个对象; -
void removeAttribute(String name)
:用来移除ServletContext
对象中的属性,如果内该属性不存在,那么这个方法不会做任何事情(不会报错); -
Enumeration getAttributeNames()
:获取所有域属性的名称。
网友评论