IT兄弟连 JavaWeb教程 Servlet中定义的变量的作用域类型

  • 2019 年 10 月 5 日
  • 笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ITXDL123/article/details/90089732

在Java语言中,局部变量和实力变量有着不同的作用于,它们的区别如下:

局部变量在一个方法中定义,每当一个线程执行局部变量所在的方法时,在线程的堆栈中就会创建这个局部变量,当线程执行完该方法,局部变量就会结束生命周期,如果有多个线程同时执行该方法,那么每个线程都拥有自己的局部变量。

实例变量在类中定义。类的每一个实例都拥有自己的实例变量,如果一个实例结束生命周期,那么属于它的实例变量也就结束生命周期。如果有多个线程同时执行一个实例的方法,而这个方法会访问一个实例变量,那么这些线程访问的是一个实例变量。

在上面的HelloServlet案例中的username变量代表每个HTTP请求中的用户名信息。HTTP请求和线程,以及HTTP请求和username变量之间存在以下对应关系:

一个HTTP请求对应一个工作线程。

一个HTTP请求对应一个username变量。

由此可以推出,一个工作线程也应该对应username变量,所以应该把username变量作为service()方法的局部变量,而不应该作为HelloServlet类的实例变量。

public class HelloServlet2 extends HttpServlet{

public void service(HttpServletRequest request,

HttpServletResponse response)throws ServletException,IOException{

String username = request.getParameter("username");

}

}

在web.xml文件中为HelloServlet2映射的URL为"/hello2",通过这两个浏览器同时访问HelloServlet2,两个浏览器都会得到与当前请求匹配的响应结果。这是因为服务器端的两个线程在执行同一个HelloServlet2对象的service()方法时,拥有各自的username局部变量,它们分别代表各自的HTTP请求中的用户名,如图所示。

HelloServlet类把username变量定为实例变量,一个HelloServlet对象只有一个username实例变量。当服务器端的工作线程并发执行同一个HelloServlet对象的service()方法时,该方法操纵的是同一个username实例变量,由于两个工作线程都操纵同一个username实例变量,第二个工作线程会把第一个工作线程对username变量所赋的值覆盖掉了,因此第一个工作线程向客户端返回"您好,小鸭"。