Servet
一、Servlet 是单例吗
不是。
1、你可以用多个 URL 映射同一个 Servlet。这样就会出现多个实例。
2、看看 Servlet 定义:
如果 servlet 不是在分布式环境下(默认),servlet 容器必须使一个 servlet 实例对应一个 servlet 声明。
However, for a servlet implementing the SingleThreadModel(Deprecated) interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.
然而,实现了 SingleThreadModel 接口的 Servlet,可以有多个实例。以处理繁重的请求,并且序列化 request 到特定的 servlet 实例。
public interface SingleThreadModel
Ensures that servlets handle only one request at a time.
结论:
虽然 Servlet 在多数情况下只有一个实例。但它并不是单例设计模式,即不是真正的单例。
二、Servlet 为什么是线程不安全的
基于 JVM 对多线程的支持,这样可以提高代码的执行效率。
不需要为每一个请求都要单独创建/销毁 Servlet(执行 init(), desdroy() )。
同一段代码可以在同一时间被多个请求同时执行。
Servlet 是普通的 Java 类,因此没有对其做线程安全的处理。
三、如何保证线程安全?(避免不安全)
但是,
Java 的类是线程安全的,只有在一种情况下:该类没有 instance variables.
即,没有(实例)变量时。
实例变量(instance properties)是声明在类中的变量,而不是声明在方法中的变量。
声明在方法中的变量是线程安全的,因为在执行该方法时,每一个线程都会在 Stack 中创建它们各自的变量。
因此,方法中的变量不存在线程不安全问题。
- public class ExampleServlet extends HttpServlet {
- private Object thisIsNOTThreadSafe;
- protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- // BAD!! Shared among all requests!
- thisIsNOTThreadSafe = request.getParameter("foo");
- // OK, this is thread safe.
- Object threadSafeObj;
- threadSafeObj = request.getParameter("foo");
- }
- }
四、拓展:Struts2 中的 Action 对象是单例吗?
不是。
当请求到来时,Web 容器为每一个请求创建一个 Request 和 Response 对象。
然后再创建一个线程,并把这两个对象的引用指向该线程。
Struts2 中的 Action 对象是 re-created 的,为每一个请求。并绑定到 Request 对象上,
作为 Request 对象的一个属性。这样就不存在线程不安全问题,因为每一个 Request 对象
只绑定一个线程。
注意:不要混淆 Struts DispatcherFilter 和 StrutsAction
Servet的更多相关文章
- SERvet的表单
首先要建立好数据库. 好了,先写好两个静态页面,分别负责登录和注册. 代码清单1:login.jsp(登录页面) <%-- Document : login Created on : 2013- ...
- servet概述
1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...
- 第一个servet(用注解),不用web.xml
环境: idea 1.新建模块 2.在蓝色src下新建一个包com.test 3.在包下新建servlet 4.写代码 package com.test; import javax.servlet.S ...
- window servet 2012 r2 配置php服务器环境
绑定:https://jingyan.baidu.com/article/0bc808fc2c6a851bd485b92a.html 配置环境:http://www.jb51.net/article/ ...
- c 网络与套接字socket
我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...
- 高效 Java Web 开发框架 JessMA v3.5.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- 高效 Java Web 开发框架 JessMA v3.4.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- Libevent初探
Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...
- J2EE学习(2)--何謂容器【良葛格学习笔记搬】
何謂容器 對於Java程式而言,JVM(Java Virtual Machine)是其作業系統,.java編譯為.class檔案,.class對於JVM而言,就是其可執行檔,你的Java程式基本上只認 ...
随机推荐
- 代码管理工具:使用github和git工具管理自己的代码
一.git工具和账户创建 1.1 安装 Git 是 Linus Torvalds 最近实现的源代码管理软件."Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系 ...
- PHP中遍历二维数组—以不同形式的输出操作
<body> <?php //定义二维索引数组$arr = array( array("101","李军","男", ...
- 获取当前div以外所有部分
$("功能区域的id").click(function(e){ $(this).show(); e.stopPropagation();//阻止冒泡 }); $("父类区 ...
- visual studio属性管理器
位于 视图->其它窗口 项目配置属性,这个项目的属性别的项目也需要的时候可以把属性页复制到新项目. 以及配置单个项目的不同构建方案
- Kaldi中的Chain模型
Chain模型的训练流程 链式模型的训练过程是MMI的无网格的版本,从音素级解码图生成HMM,对其使用前向后向算法,获得分母状态后验,通过类似的方式计算分子状态后验,但限于对应于转录的序列. 对于神经 ...
- win7用VMware安装CentOs7搭建Linux环境
1. 首先要安装VMware 安装及破解教程 http://www.cnblogs.com/zhangqian27/p/9088237.html 2. 下载os镜像 CentOS下载地址: 阿里云开源 ...
- 《Java编程思想第四版》附录 C Java 编程规则
附录 C Java 编程规则 本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符 ...
- JAVA锁和volatile的内存语义&volatile的使用场景
JAVA锁的内存语义 当线程释放锁时,JMM(Java Memory Model)会把该线程对应的本地内存中的共享变量刷新到主内存中. 当线程获取锁时,JMM会将该线程对应的本地内存置为无效.从而使得 ...
- ASP.NET MVC - NPOI读取Excel
引入: using System; using System.Data; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserM ...
- T5557 读写卡详解
T5557的基本信息就不在这里详细介绍,不了解的可以去看T5557的收据手册. 一上来直接开始讲操作 存在七种操作,我们重点介绍四种,Standard Write,Protected Write,Di ...