Servlet(2)-多线程同步问题和ServletContext

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():获取所有域属性的名称。

你可能感兴趣的:(Servlet(2)-多线程同步问题和ServletContext)