一、Servlet 是单例吗

不是。 
1、你可以用多个 URL 映射同一个 Servlet。这样就会出现多个实例。

2、看看 Servlet 定义:

引用
For a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. 
如果 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 中创建它们各自的变量。 
因此,方法中的变量不存在线程不安全问题。

  1. public class ExampleServlet extends HttpServlet {
  2. private Object thisIsNOTThreadSafe;
  3. protected void doGet(HttpServletRequest request,
  4. HttpServletResponse response) throws ServletException, IOException {
  5. // BAD!! Shared among all requests!
  6. thisIsNOTThreadSafe = request.getParameter("foo");
  7. // OK, this is thread safe.
  8. Object threadSafeObj;
  9. threadSafeObj = request.getParameter("foo");
  10. }
  11. }

四、拓展:Struts2 中的 Action 对象是单例吗?

不是。 
当请求到来时,Web 容器为每一个请求创建一个 Request 和 Response 对象。 
然后再创建一个线程,并把这两个对象的引用指向该线程。

Struts2 中的 Action 对象是 re-created 的,为每一个请求。并绑定到 Request 对象上, 
作为 Request 对象的一个属性。这样就不存在线程不安全问题,因为每一个 Request 对象 
只绑定一个线程。

注意:不要混淆 Struts DispatcherFilter 和 StrutsAction

Servet的更多相关文章

  1. SERvet的表单

    首先要建立好数据库. 好了,先写好两个静态页面,分别负责登录和注册. 代码清单1:login.jsp(登录页面) <%-- Document : login Created on : 2013- ...

  2. servet概述

    1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...

  3. 第一个servet(用注解),不用web.xml

    环境: idea 1.新建模块 2.在蓝色src下新建一个包com.test 3.在包下新建servlet 4.写代码 package com.test; import javax.servlet.S ...

  4. window servet 2012 r2 配置php服务器环境

    绑定:https://jingyan.baidu.com/article/0bc808fc2c6a851bd485b92a.html 配置环境:http://www.jb51.net/article/ ...

  5. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  6. 高效 Java Web 开发框架 JessMA v3.5.1

    JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...

  7. 高效 Java Web 开发框架 JessMA v3.4.1

    JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...

  8. Libevent初探

    Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...

  9. J2EE学习(2)--何謂容器【良葛格学习笔记搬】

    何謂容器 對於Java程式而言,JVM(Java Virtual Machine)是其作業系統,.java編譯為.class檔案,.class對於JVM而言,就是其可執行檔,你的Java程式基本上只認 ...

随机推荐

  1. Frameset 框架

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...

  2. webpack提示安装webpack-cli

    webpack 安装后提示CLI webpack 4X 后需要安装webpack-cli 请注意需要安装在同一目录 方法: 第一步:npm install -g webpack-cli 第二部: 同步 ...

  3. CSS面试复习(一):HTML强化

    1. HTML常见元素和理解 head类 meta:字符集.base:路径. a[href,target] img[src,alt] table td[colspan,rowspan] form[ta ...

  4. python 的基础 学习 第八天数据类型的补充 ,集合和深浅copy

    1,数据类型的补充: 元组()tuple,如果只有元素,并且没有逗号,此元素是什么数据类型,该表达式就是什么数据类型. tu = ('rwr') print(tu,type(tu)) tu = ('r ...

  5. windows平台下利用Nginx做负载均衡

    1.下载nginx(http://nginx.org/en/download.html)安装包,解压,并使用cmd命令转到nginx.exe所在的目录 2.执行cmd命令start nginx启动ng ...

  6. day 2 - 逻辑运算

    1. 初识编码 最早的'密码本' ascii 涵盖了英文字母大小写,特殊字符,数字. ascii 只能表示256种可能,太少,后来创办了万国码 unicode 16表示一个字符不行,32位表示一个字符 ...

  7. MySQL基本命令(待更新...)

    数据库操作SQL语句 show databases; 表操作SQL语句 数据库权限操作SQL语句 参考链接 :http://www.cnblogs.com/bzys/archive/2013/01/2 ...

  8. Flask三种导入配置文件的方式

    # 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...

  9. 20165234 2017-2018-2《Java程序设计》课程总结

    2017-2018-2<Java程序设计>课程总结 一.作业链接汇总 每周作业链接 预备作业一:我期望的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:Linux安装及学习 第 ...

  10. 关于Anaconda的环境和包管理

    Anaconda相对于原生python解释器具有更好的包管理功能,它有一个env文件夹,里面包含所要管理的所有环境:日常操作时我们可能会使用pytorch.Tensorflow等多个环境,由于每个环境 ...