Servlet的单例模式
servlet的单例模式
servlet 在容器中是单例模式存在的,只会创建一个.
每次用户发送了请求到容器,容器就会从线程池中分配一个线程给这个请求,请求完毕之后线程将会再次回收到池中,
多个线程同时访问一个 servlet, 就会存在安全风险
Demo: 避免 servlet 安全风险
第一种方式: 创建单线程的 servlet (使用servlet 的单线程创建模式)
之后 servlet, 就同一时间只能一个线程访问 (一个用户访问),
其他用户需要排队访问 servlet, 但这种方式不能使用
1 @SuppressWarnings("serial") 2 public class EmpServlet extends HttpServlet implements SingleThreadModel{ 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 try { 6 TimeUnit.SECONDS.sleep(10); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 System.out.println(Thread.currentThread().getName() + "线程正在使用 servlet"); 11 } 12 }
第二种方式:在方法中使用同步代码块
和第一种方式一样,也不能使用
1 @SuppressWarnings("serial") 2 public class EmpServlet extends HttpServlet{ 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 synchronized (this) { 6 System.out.println(Thread.currentThread().getName() + "线程正在使用 servlet"); 7 try { 8 TimeUnit.SECONDS.sleep(5); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 } 13 } 14 }
第三种方式: 避开 servlet 中定义实例变量
如果需要使用到变量就在方法中定义为局部变量,此时就不存在数据共享问题
总结:
第三种方案是推荐的, 第一二种方案会导致访问的速度风场慢, 需要线程同步(排队等待)
转载于:https://www.cnblogs.com/yslf/p/10748989.html
Servlet的单例模式相关推荐
- Servlet简介与Servlet和HttpServlet运行的流程
2019独角兽企业重金招聘Python工程师标准>>> 1.Servlet [1] Servlet简介 > Server + let > 意为:运行在服务器端的小程序. ...
- servlet学习笔记二
Servlet 主要内容: 1)表单处理 2)乱码问题 3)页面跳转 4)生命周期 一.表单处理 Servlet获取表单数据 request.getParameter():通过表单参数名获取参数值 r ...
- Java Web中的一些概念(JSP、Servlet以及过滤器等)
1.Servlet Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的 ...
- 【Java网络编程与IO流】Java之Java Servlet详解
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- JSP/Servlet 学习笔记
文章目录 Servlet/JSP 疑难汇总: Web 容器: Servlet 的相关知识点: 单例模式: 反射和注解: Web请求 JSP 相关内容: 网页中的编解码相关问题: 数据库使用的相关问题: ...
- Servlet的生命周期和线程安全问题
目录 Servlet简介 Servlet 架构图 Servlet 任务 Servlet的生命周期 init() 方法 service() 方法 doGet() 方法 doPost() 方法 destr ...
- Servlet(理解)
目录 Servlet入门: Servlet关系视图 : Servlet映射方式: Servlet创建时机: 默认Servlet ServletConfig ServletConfig 配置方式 Ser ...
- 设计模式之单例模式应用场景篇
应用场景 我们为什么要使用单例模式呢?它有什么好处? (一)单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收. Servlet是单例模式,我们只需要创建一个Servlet ...
- struts2学习笔记--线程安全问题小结
在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样 ...
最新文章
- 荐书 | 10 本机器学习电子书,美版 Kindle 免费读
- The practice program of C on point
- iostat 输出解析
- [云炬创业基础笔记]第二章创业者测试9
- STM32开发 -- UTC、UNIX时间戳、北京时间之间的转换
- python 自定义函数语句_python 自定义函数
- ES6——Generator 函数的语法
- Android 相关翻译
- python 新建文件 hdfs_python使用hdfs3模块对hdfs进行操作详解
- 30.Linux/Unix 系统编程手册(上) -- 线程:线程同步
- 恩智浦智能车竞赛摄像头相关组入门
- shell脚本合集2
- mysql rpm mar_Centos7.3离线(rpm方式)安装mysql服务
- 第1131期AI100_机器学习日报(2017-10-23)
- 百度地图离线开发V2.0
- Python使用rawpy获取相机图像的原始RAW数据
- 一个在阿里做运营同学找一个月多月工作总结出以下几点
- Linux工具学习之【gcc/g++】
- python与js之间实现通信
- 【BUAA_CO_LAB】计组p3p4碎碎念
热门文章
- Oracle SQL Developer 调试存储过程步骤(Oracle)
- MATLAB图形界面设计(上)
- 开发常见错误之 :Missing artifact com.sun:tools:jar 1.7.0
- UVALive 7276	Wooden Signs (DP)
- Geotools之“Hello World”——打开本地shp文件并显示
- 为什么不能在scrollview中直接添加一个image,然后使animation.begin()??
- PHP中stripslashes函数的小结
- 在线ASCII流程图编辑器工具
- RabbitMQ学习之Work Queues(2)
- python ----元组方法以及修改细节