关于java Servlet,Struts,springMVC 的线程安全问题
2019独角兽企业重金招聘Python工程师标准>>>
现在主流的java的前端框架有:struts1,struts2,springmvc 还有最根本的servlet;
前些天一个朋友问我这方面的问题,就研究一番:
1.关于struts1:
Struts1使用的ActionServlet是单例的,由这一个servlet处理所有.do请求。RequestProcessor也是单例。
RequestProcessor的processActionCreate方法:
/*** <p>Return an <code>Action</code> instance that will be used to process* the current request, creating a new one if necessary.</p>** @param request The servlet request we are processing* @param response The servlet response we are creating* @param mapping The mapping we are using* @return An <code>Action</code> instance that will be used to process* the current request.* @throws IOException if an input/output error occurs*/protected Action processActionCreate(HttpServletRequest request,HttpServletResponse response, ActionMapping mapping)throws IOException {// Acquire the Action instance we will be using (if there is one)String className = mapping.getType();if (log.isDebugEnabled()) {log.debug(" Looking for Action instance for class " + className);}Action instance;// 这个同步快保证了Action的单例synchronized (actions) {// Return any existing Action instance of this classinstance = (Action) actions.get(className);if (instance != null) {if (log.isTraceEnabled()) {log.trace(" Returning existing Action instance");}return (instance);}// Create and return a new Action instanceif (log.isTraceEnabled()) {log.trace(" Creating new Action instance");}try {instance = (Action) RequestUtils.applicationInstance(className);// Maybe we should propagate this exception// instead of returning null.} catch (Exception e) {log.error(getInternal().getMessage("actionCreate",mapping.getPath()), e);response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,getInternal().getMessage("actionCreate", mapping.getPath()));return (null);}actions.put(className, instance);if (instance.getServlet() == null) {instance.setServlet(this.servlet);}}return (instance);}
从结果可以知道,是单例,既然是单例,如果当使用实例变量的时候就会有线程安全的问题;
2.关于struts2
我们知道我们使用struts2的时候,都是使用actionContext ;都是使用里面的实例变量,让struts2自动匹配成对象的。如果不是线程安全那全完了;所以struts2必须是线程安全的;因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;
哦,忘记了一种情况,struts2+spring来管理注入的时候;如果把action设置为单例模式,就会出现问题;可以把action设置为prototype类型,还有一个办法是设置作用域(具体没有实验过)
参考来源
3.关于SpringMVC
SpringMVC的controller默认是单例模式的,所以也会有多线程并发的问题;
参考代码:
@RequestMapping("/user")
@Controller
Class UserController
{@ResourceUserService userService;@RequestMapping("/add")public void testA(User user){userService.add(user);}@RequestMapping("/get")public void testA(int id){userService.get(id);}
}@Service("userService")
Class UserService{public static Map<Integer,User> usersCache = new HashMap<String,User>();public void add(User user){usersCache.put(user.getId(),user);}public void get(int id){usersCache.get(id);}}
usersCache就是非线程安全的。
解决方法:
1)同步共享数据
2)不使用成员实例变量;
3)使用只读数据
参考文章:
深入研究Servlet线程安全性问题
Struts的线程安全问题
深入研究Servlet线程安全性问题
转载于:https://my.oschina.net/Tonyjingzhou/blog/514345
关于java Servlet,Struts,springMVC 的线程安全问题相关推荐
- java并发之如何解决线程安全问题
java并发之如何解决线程安全问题 参考文章: (1)java并发之如何解决线程安全问题 (2)https://www.cnblogs.com/w2154/p/6637717.html 备忘一下.
- Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字
线程安全问题是多线程编程中最典型的一类问题之一.如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的. 通俗来说,线程不安全指的就是某一代 ...
- servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变
Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- 【Java并发编程一】线程安全问题
1.多线程的实现 多线程有两种实现方式: 1.1.继承Thread类 =>示例:A a=new A(); a.start(); 1.2.实现Runnable接口 =>示例:A a=ne ...
- Java中实例变量的线程安全问题的分析
public class Test{private int count = 5;//模拟库存量public void reduceStock(){//模拟减少库存count--;System.out. ...
- java语言高级-Thread类线程安全问题
hui一.线程的安全问题: 这里使用窗口售票的例子,每个窗口相当于不同的线程,当不考虑线程安全问题时,此时会出现下面的情况 窗口2 当前剩余票:3 窗口3 当前剩余票:1 窗口2 当前剩余票:0 窗口 ...
- JAVA多线程(一)线程安全问题产生的原因
JAVA线程内存与主存间映射示意图 Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用的变量到主内存副本拷贝,线程对变量的所有操作(读取. ...
- javaweb学习总结二十三(servlet开发之线程安全问题)
一:servlet线程安全问题发生的条件 如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源.如果访问 的不是相同资源,则不存在线程安全问题. 实例1:不会产生线程 ...
- volatile关键字和Java线程安全问题
一.java中的线程安全问题 我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且 ...
最新文章
- mysql行格式化_MySQL数据格式化语句
- bind merge r 和join_R语言数据合并
- 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
- 物联网产品:你需要知道的9种智能家居产品
- 谋定重整衍生新360行-李玉庭:协同电商经信研究生态系统
- SAP Spartacus layout设计原理
- Java多线程(review)
- 2021年中国机器视觉市场研究报告
- robot framework学习五——AutoltLibrary库
- 【Windows】DOS的常用命令
- java sap_SAP系统安装之JAVA
- 全国通用DNS服务器
- 金仓数据库KingbaseES客户端连接问题
- NLP自然语言处理系列-词汇挖掘与实体识别
- ubuntu 下创建加密文件夹
- 从数据分析角度谈谈谁才是这个夏天的无价之姐——基于弹幕文本分析
- windows 8 修改窗口颜色为淡绿色
- 钉钉分享唤起三方app
- Google GMS Crash 优化方案
- 8421码,5421码,2421码,余3码特点及转换
热门文章
- 单脉冲雷达的相干干扰的研究文章_什么是量子纠缠和量子退相干?这个比喻太绝了!...
- oracle忘记实例名,Oracle的安装和MS SQL Server实例名
- DeepLearning:模型之间的相互转化(keras-hdf5→Tensorflow-pb文件)
- 【总结】那些只要发送口令就能获取的有三AI大包视频和图文资料,你都存下来了吗...
- 全球及中国拉丝润滑剂粉末行业投资潜力及发展战略规划报告2021-2027年
- 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
- eclipse中导入spring-boot框架的jar包方法
- PHP下实现两种ajax跨域的解决方案之jsonp
- 分享一个JDK1.8丢失数字精度的案例
- sysfs: cannot create duplicate filename '/class/spi_master/spi1'