如何实现servlet得单线程模式
2013-12-03 11:23
190 查看
如何现实servlet的单线程模式
这个面试题挺经典的,可是网上很多朋友的回答题不达意,所以我在这里就这个问题做一下探讨。网上朋友的回答是加入<%@ page
isThreadSafe=”false”%>这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到servlet中呢?当然了,jsp的运行实质是servlet机制,这条命令是jsp页面告诉容器编译“我”的时候实现单线程。那我们看看他编译后的servlet类和以前的servlet有什么不同?没有加入这条指令的页面中servlet类定义是:
public final class index_jsp extends
org.apache.jasper.runtime.HttpJspBase
implements
org.apache.jasper.runtime.JspSourceDependent {
………………………………//内部实现咱们大可以不看他。
}
而加入这个命令之后的类定义是:
public final class index_jsp extends
org.apache.jasper.runtime.HttpJspBase
implements
org.apache.jasper.runtime.JspSourceDependent,
SingleThreadModel {
…………………………//同样省略实现细节
}
我想大家应该很清楚的发现:加入<@page
isThreadSafe="false">之后servlet是实现了SingleThreadModel接口的。有兴趣的朋友可以查下相关资料,其实这个接口在servlet2.4之后就废除了。那么为什么废除?实现了这个接口查看代码内容的时候却发现什么方法都没添加,为什么?
其实这个接口只是一个标识,让容器改变servlet生成策略的。
默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。
但是如果一个servlet实现了SingleThreadModel接口那容器在创建实例池,为每个求情分配实例,当用户请求结束时将实例归还实例池。
这样做真的安全吗?非也!因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的。于是在servlet2.4中建议不再使用这样的设置。
这样一来我们知道:如果非要实现servlet单线程那就要在servlet中实现SingleThreadModel接口,在jsp中添加<@
page isThreadSafe="false">命令。但是这是不被提倡的。
也有网友疑问:让servlet单线程而多实例本来不是为了线程安全的吗?为什么<@ page
isThreadSafe=?>?的答案却是false?
我觉得这是个误区,这样设置真的是单线程吗?那肯定不是了,其实这个设置只是要容器保证同一时刻只有一个线程能在servlet的service方法中执行,因为默认的容器实例化servlet时时単实例,如果同时只有一个线程去管理这个唯一的servlet实例,那性能将是极其慢的,为了解决这个问题,容器采取了servlet实例池的方式。每个请求一个线程,而一个线程一个servlet。
因为这种方式并不是线程安全的,所以答案是false。
终上所述:其实这道题目是指如果让一个servlet实例对应一个线程,而不是一个servlet实例对应多个线程的默认方式
相关文章推荐
- 如何实现servlet的单线程模式
- 如何实现servlet的单线程模式
- 如何实现servlet的单线程模式
- 如何实现jsp或servlet的单线程模式
- Java - 如何实现JSP或Servlet的单线程模式?
- 如何实现servlet的单线程模式 j2ee 文档解析
- 如何现实servlet的单线程模式
- 如何现实servlet的单线程模式
- 如何现实servlet的单线程模式?
- 最简单的跨线程实现方式,不知使用如何,今天记下。明天试试!
- 面试题1:如何实现C++单例模式?
- 如何在Java中实现线程?
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- 如何在C#中实现窗体全屏模式
- 拿来主义:java中的线程安全与非线程安全,以及如何使用和实现
- node.js chat程序如何实现Ajax long-polling长链接刷新模式
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
- android实现观察者模式没有效果,没有达到预期的效果,不知如何解决