http://blog.sina.com.cn/s/blog_51103a35010144y1.html
BAIDU知道上看到的一段话,觉得说得很好。
Java还有很多需要学习的地方啊
1.javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet类实现了这个接口,那么Servlet容器将保证在同一个时刻只有一个线程可以在给定的servlet实例的service方法中执行。而将其他所有请求进行排队。
服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。因此,不建议实现SingleThreadModel接口,因为它在servlet规范中已经被废弃了。
2.使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理。在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
HttpSession(线程是不安全的)
HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。
当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。
这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。
对于每一个请求,ServletRequest由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。所以ServletRequest是线程安全的。ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
对于集合, 使用线程安全的Vector代替ArrayList,使用Hashtable代替HashMap。
不要在Servlet中创建自己的线程来完成某个功能。
Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。
,在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁,做到互斥的访问
对于为什么要在doget方法里另上同步块,就是因为解决:当a,b同时访问时,如果a比b稍慢一些就会出现这样的情况,a页面空白,而b页面出现了服务端返回给a的结果,假如是比较敏感的个人信息不能让他人知道的,而这种情况就会出现严重的安全问题,使用同步块并加锁可以做到a,b访问时两者的信息不会被对方及第三方知道!
相关推荐
9. **异步Servlet**:自Java Servlet 3.0起,Servlet支持异步处理,使得Servlet可以在不阻塞线程的情况下处理请求,提高了服务器的并发性能。 10. **Servlet的部署与调试**:了解如何在Servlet容器中部署Web应用,...
2. **异步处理**:Servlet 3.0引入了异步Servlet,允许服务器在处理请求时释放线程,从而提高了并发性能。通过调用`HttpServletRequest.startAsync()`方法,可以启动一个异步上下文,然后在后台处理任务,完成后通过...
相比于早期的Common Gateway Interface(CGI),Servlet在性能和跨平台能力上有显著优势。Servlet运行在Java虚拟机上,通过多线程模型处理并发请求,减少了系统资源的消耗。此外,由于Servlet遵循Java标准API,因此...
在Java Web开发中,Servlet和Spring MVC(主要通过Controller)是两种常见的请求处理机制。本文将深入探讨原生Servlet与Spring Controller在性能方面的差异,并基于一个名为"AbTest"的Servlet项目源码进行分析。 ...
这样,Servlet可以在后台线程中执行耗时的操作,而不会阻塞HTTP请求的处理,从而提高了Web应用的性能和响应速度。 2. **非阻塞I/O (NIO)**:Servlet 3.1支持非阻塞I/O,利用Java的`java.nio`包,可以更高效地处理...
在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种常见的技术,它们用于创建动态网页。JSP主要用于视图层,而Servlet则在控制层处理请求和响应。有时,开发者可能需要将HTML或者JSP页面的内容转换为Servlet...
* 高性能:Servlet 的性能非常高,能够满足高并发和高流量的需求。 * 多线程:Servlet 可以以多线程方式运行,提高了服务器的响应速度和处理能力。 * 统一接口:Servlet API 提供了统一的编程接口,方便开发者快速...
4. **性能考量**:由于JSP在首次访问时需要转换和编译,因此在高并发场景下,Servlet可能拥有更好的性能表现,尤其是在对性能要求较高的应用中。 总之,JSP和Servlet都是Java Web开发中不可或缺的技术,它们各有...
6. **异步处理**:Servlet 3.0引入了异步处理,允许在`service()`方法内部启动一个新的线程,从而提高并发性能。通过`AsyncContext`接口,开发者可以在后台执行任务,而不阻塞主线程。 7. **Session管理**:Servlet...
总之,J2EE Servlet 2.5为开发者提供了强大的Web应用程序开发能力,其丰富的特性和API使得开发者能够构建出高性能、可扩展的企业级应用。对于J2EE初学者来说,深入理解Servlet 2.5规范,掌握上述知识点,是迈向专业...
在"Controller项目"中,我们可以通过编写基准测试(如使用JMeter或 Gatling)来具体比较原生Servlet和Spring Controller在处理相同请求时的性能。这有助于了解在特定场景下哪种方式更适合。 总的来说,原生Servlet...
- Servlet的主要特点包括有效性(高效)、健壮性(利用Java的强大功能)、可移植性(跨Web服务器)和持久性(通过减少磁盘读取提高性能)。 2. **Servlet与Applets的区别** - Applets是嵌入在Web页面中的程序,...
Servlet 2.3是Java Servlet规范的一个版本,这个版本在Servlet 2.2的基础上进行了许多增强和改进,以提高性能、可移植性和可维护性。本帮助文档详细介绍了Servlet 2.3的主要特性和用法。 1. **Servlet生命周期**:...
在本文中,我们将深入探讨Servlet规范的关键知识点,以及它如何提升Java Web设计思想和设计原理的理解。 1. **Servlet接口**:Servlet的核心是Servlet接口,它定义了服务器端组件所需的一系列方法,如`init()`、`...
Servlet 3.0引入了异步处理能力,使得Servlet可以在`service()`方法内启动异步任务,提高并发性能。 10. **MVC框架与Servlet的关系**: MVC(Model-View-Controller)框架如Spring MVC、Struts等,虽然提供了更高...
2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,使得在处理长运行任务时,服务器不再需要为每个请求分配一个单独的线程,从而提高了服务器的并发性能。通过`ServletRequest.startAsync()`方法,开发者可以...
1. **异步处理**:Servlet3.1引入了异步Servlet API,使得开发者可以将处理任务放到后台执行,而不会阻塞线程,从而提高了服务器的并发性能。通过`AsyncContext`,开发者可以在不占用线程的情况下处理长时间运行的...
12. **异步处理**:尽管Servlet 2.5并未直接提供异步处理能力,但它的设计为后来Servlet 3.0中的异步处理打下了基础,使得Servlet可以返回控制权给容器,以便处理其他请求,提高并发性能。 综上所述,Servlet 2.5...
2. **异步处理**:Servlet 3.0支持异步处理,允许Servlet在处理请求时释放线程,提高服务器的并发性能。通过`HttpServletRequest.startAsync()`方法启动异步处理,然后在另一个线程中完成业务逻辑,最后调用`...
Servlet3.1规范是Java Web开发中的一个重要里程碑,它在Servlet3.0的基础上引入了许多增强功能,提高了Web应用的性能和可扩展性。这个中文最终版的文档为开发者提供了全面的指南,帮助他们理解并利用这些新特性进行...