当servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,提供了读取或设置共享数据的方法:
setAttribute(String name, Object object); getAttribute(String name);
在Servlet中获取application(ServletContext):
ServletContext context = req.getSession().getServletContext();
由于Servlet/JSP默认是以多线程模式执行的,但是Servlet是单实例的,所以,在编写代码时需要考虑多线程的并发同步问题。例如,当有多个用户同时访问某个Servlet时,会访问这个唯一的Servlet实例中的成员变量,如果对成员变量进行赋值,就会导致数据不一致。
简单说下线程中的工作内存:
Java的内存模型JMM(Java Memory Model)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
下面这个Servlet当有多个用户同时访问时,由于Servlet是单实例的,在10秒钟内有两次访问时,这是共享的username成员就赋值为后者传递过来的username,当两者返回给客户端数据时,如果通过以下方式获取username,则都是得到后者传递的username的值:
request.getAttribute("username");
但是如果从request请求(每个用户对应一个请求,两个请求互不干扰)范围内获取username则得到的是各自传递给该Servlet的值:
request.getParameter("username");
public class ThreadServlet extends HttpServlet { private String username; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.username = req.getParameter("username"); try{ Thread.sleep(10000); } catch(Exception e){ e.printStackTrace(); } req.setAttribute("username", username); req.getRequestDispatcher("result.jsp").forward(req, resp); } }
为了解决上面的问题,可以把成员变量username变为 doGet的局部变量。
b、或者使用同步代码块
c、实现javax.servlet.SingleThreadModel,使得Servlet实例以单线程方式运行,即是同一时刻只有一个线程执行Servlet的service()方法。
小结
相关推荐
- 要解决线程安全问题,避免使用全局变量,而是使用局部变量或同步方法。 8. **Servlet配置信息获取** - 通过ServletConfig对象获取Servlet的配置信息,如在`web.xml`中定义的初始化参数。 - ServletConfig还...
6. 多线程:了解Thread类和Runnable接口,以及同步控制方法synchronized和wait/notify机制。 其次,JSP是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的数据处理。在"jsp笔记.doc"中,...
9. **多线程**:Servlet默认是线程安全的,一个Servlet实例可以服务于多个并发请求。开发者需要注意同步问题,避免在Servlet中使用静态变量存储请求相关数据。 10. **过滤器(Filter)**:Servlet API还提供了过滤...
6. **多线程**:Java提供了并发编程的支持,包括线程的创建、同步、互斥等。学习Thread类和Runnable接口,以及synchronized关键字、wait()、notify()和notifyAll()方法的使用。 7. **网络编程**:Java的Socket编程...
* Java多线程编程:线程的创建、同步、通信、死锁等问题的解决。 * Java网络编程:Socket编程、HTTP编程、TCP/IP协议等的应用。 * Java数据库编程:JDBC、Hibernate、MyBatis等数据库访问技术的使用和应用。 Java...
4. **多线程**:在Web环境中,多线程技术用于实现并发处理,提高程序的执行效率。包括线程的创建、同步、死锁等概念。 5. **Servlet与JSP**:Servlet是Java Web应用的核心组件,负责接收和响应HTTP请求。JSP(Java...
4. **多线程**:Java提供对多线程的支持,理解线程的创建、同步和通信有助于编写高效并发代码。 5. **网络编程**:Java的Socket编程允许开发网络应用。理解TCP和UDP协议,以及如何创建客户端和服务器是必备技能。 ...
6. **多线程**:Java提供了内置的多线程支持,笔记会讲解线程的创建、同步、通信等,以及死锁、活锁、饥饿等并发问题的解决方案。 7. **反射与注解**:反射允许在运行时检查和修改类、接口、字段和方法,注解可以...
6. **多线程**:每个请求都会创建一个新的Servlet实例,因此Servlet天生支持多线程,需要注意同步问题以避免数据竞争。 【JSP知识点】: 1. **JSP简介**:JSP是一种动态网页技术,将HTML、CSS、JavaScript与Java...
此外,笔记中可能还涵盖了异常处理、集合框架(如ArrayList、LinkedList、HashMap等)、IO流、线程同步和并发编程。这些主题对于开发复杂、高效的应用程序至关重要。 JavaGossip-V1和JavaGossip-V2可能是笔记的不同...
7. **多线程**:理解线程的概念,使用Thread类和Runnable接口创建线程,以及同步机制(synchronized关键字、wait/notify方法)。 8. **网络编程**:学习套接字编程,实现客户端和服务端的通信。 9. **反射**:通过...
这份"java笔记(细节问题讲的很细)"很可能包含了Java语言的核心概念、类库使用、编程技巧以及常见问题的解决方案。 一、Java基础 1. 变量与数据类型:Java提供了八种基本数据类型,包括整型、浮点型、字符型和...
7. **面试笔记**:这部分可能是针对Java程序员常见的面试问题的解答,涵盖设计模式、集合框架、多线程、异常处理、垃圾回收机制、Java内存模型、JVM优化等方面的知识。 通过对这些内容的学习,读者不仅可以掌握Java...
5. **多线程**:Java内置了强大的多线程支持,笔记会讲述如何创建和管理线程,以及同步机制如synchronized关键字和wait/notify方法,帮助开发者理解和实现并发程序。 6. **网络编程**:Java提供了丰富的网络编程API...
14. **Java EE**:对于进一步的学习,笔记可能还会提及Java企业版(Java EE),它为构建分布式、基于Web的应用提供了服务器端框架,包括Servlet、JSP、EJB等技术。 15. **实战项目**:学习笔记通常会包含一些简单的...
八、Servlet的多线程模型 Servlet容器会为每个请求创建一个新的线程,因此Servlet必须是线程安全的。开发者需要注意共享数据的同步问题。 九、Servlet的优化 1. 使用`@WebServlet`注解进行配置,减少XML配置。 2. ...
11. **Java EE(企业版)**:如果笔记涉及到此部分,可能会讲解Servlet、JSP、EJB等用于构建Web应用的技术。 12. **JVM(Java虚拟机)**:了解JVM的工作原理,如类加载、内存管理、垃圾回收等,对于优化Java程序...
6. **多线程**:线程的创建、同步和通信,死锁的概念。 7. **反射机制**:运行时动态加载类,修改对象行为,调用私有方法等。 8. **JNI**:Java本地接口,允许Java代码调用C/C++函数。 二、Java EE(企业版) Java ...
5. **多线程**:Java支持多线程编程,通过Thread类和Runnable接口创建和管理线程,以及同步机制(synchronized关键字、wait/notify方法等)防止线程竞态条件。 6. **网络编程**:Java提供了Socket和ServerSocket类...
多线程在JAVA中也占据重要地位。通过Thread类和Runnable接口,开发者可以创建并管理多个执行线程,实现并发执行。同步机制,如synchronized关键字和wait/notify机制,保证了线程安全。 最后,JAVA EE(企业版)是...