当前位置: 首页 > news >正文

Servlet线程安全的解决方法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。

当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。

这样的话,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以就很容易造成一系列的一些安全性问题。

解决此类的方法也有多

1、实现 SingleThreadModel 接口

该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了

public class XXXXX extends HttpServlet implements SingleThreadModel {  
    …………  
} 

2、同步对共享数据的操作

使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中可以通过同步块操作来保证Servlet的线程安全。同步后的代码如下:

Public class XXXXXX extends HttpServlet {  

    synchronized (this){XXXX}  
     
    } 
}

3、避免使用实例变量

线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

小结

Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。

转载于:https://my.oschina.net/u/213148/blog/176478

相关文章:

  • php 多个文件上传
  • mysql单表体积和一个库设计多少张表为妥
  • 安装DPM 2012 R2时报错一例
  • 错误日志记录
  • 动态编译执行java类
  • 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第三章3-3日历provider...
  • Android中的回调Callback
  • 组成_05_CPU
  • 组播地址列表
  • linux 关闭SSH 连接用户
  • 编程面试的10大算法概念汇总
  • solarwinds engineer's toolset   V9.1 安装 及注册机
  • 理解并取证:IPv6与IPv4在报文结构上的区别
  • hibernate 如何实现延迟加载
  • VMware中Ubuntu网络正常但ping不出去
  • [译] 怎样写一个基础的编译器
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 30秒的PHP代码片段(1)数组 - Array
  • js正则,这点儿就够用了
  • PAT A1120
  • Ruby 2.x 源代码分析:扩展 概述
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 半理解系列--Promise的进化史
  • 测试如何在敏捷团队中工作?
  • 动态规划入门(以爬楼梯为例)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于遗传算法的优化问题求解
  • 将回调地狱按在地上摩擦的Promise
  • 聚簇索引和非聚簇索引
  • 两列自适应布局方案整理
  • 你不可错过的前端面试题(一)
  • 前端面试题总结
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用SAX解析XML
  • 算法---两个栈实现一个队列
  • 网页视频流m3u8/ts视频下载
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一道面试题引发的“血案”
  • 译有关态射的一切
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 再次简单明了总结flex布局,一看就懂...
  • 《天龙八部3D》Unity技术方案揭秘
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (zhuan) 一些RL的文献(及笔记)
  • (九)信息融合方式简介
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)Controller接口控制器详解(三)
  • (算法二)滑动窗口
  • (一) storm的集群安装与配置
  • (一)WLAN定义和基本架构转
  • (一一四)第九章编程练习
  • (转)ABI是什么
  • (轉)JSON.stringify 语法实例讲解
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)