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 的线程安全问题相关推荐

  1. java并发之如何解决线程安全问题

    java并发之如何解决线程安全问题 参考文章: (1)java并发之如何解决线程安全问题 (2)https://www.cnblogs.com/w2154/p/6637717.html 备忘一下.

  2. Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

    线程安全问题是多线程编程中最典型的一类问题之一.如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的. 通俗来说,线程不安全指的就是某一代 ...

  3. servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变

    Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...

  4. 【Java并发编程一】线程安全问题

    1.多线程的实现 多线程有两种实现方式: 1.1.继承Thread类 =>示例:A a=new A(); a.start();   1.2.实现Runnable接口 =>示例:A a=ne ...

  5. Java中实例变量的线程安全问题的分析

    public class Test{private int count = 5;//模拟库存量public void reduceStock(){//模拟减少库存count--;System.out. ...

  6. java语言高级-Thread类线程安全问题

    hui一.线程的安全问题: 这里使用窗口售票的例子,每个窗口相当于不同的线程,当不考虑线程安全问题时,此时会出现下面的情况 窗口2 当前剩余票:3 窗口3 当前剩余票:1 窗口2 当前剩余票:0 窗口 ...

  7. JAVA多线程(一)线程安全问题产生的原因

    JAVA线程内存与主存间映射示意图 Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用的变量到主内存副本拷贝,线程对变量的所有操作(读取. ...

  8. javaweb学习总结二十三(servlet开发之线程安全问题)

    一:servlet线程安全问题发生的条件 如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源.如果访问 的不是相同资源,则不存在线程安全问题. 实例1:不会产生线程 ...

  9. volatile关键字和Java线程安全问题

    一.java中的线程安全问题 我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且 ...

最新文章

  1. mysql行格式化_MySQL数据格式化语句
  2. bind merge r 和join_R语言数据合并
  3. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
  4. 物联网产品:你需要知道的9种智能家居产品
  5. 谋定重整衍生新360行-李玉庭:协同电商经信研究生态系统
  6. SAP Spartacus layout设计原理
  7. Java多线程(review)
  8. 2021年中国机器视觉市场研究报告
  9. robot framework学习五——AutoltLibrary库
  10. 【Windows】DOS的常用命令
  11. java sap_SAP系统安装之JAVA
  12. 全国通用DNS服务器
  13. 金仓数据库KingbaseES客户端连接问题
  14. NLP自然语言处理系列-词汇挖掘与实体识别
  15. ubuntu 下创建加密文件夹
  16. 从数据分析角度谈谈谁才是这个夏天的无价之姐——基于弹幕文本分析
  17. windows 8 修改窗口颜色为淡绿色
  18. 钉钉分享唤起三方app
  19. Google GMS Crash 优化方案
  20. 8421码,5421码,2421码,余3码特点及转换

热门文章

  1. 单脉冲雷达的相干干扰的研究文章_什么是量子纠缠和量子退相干?这个比喻太绝了!...
  2. oracle忘记实例名,Oracle的安装和MS SQL Server实例名
  3. DeepLearning:模型之间的相互转化(keras-hdf5→Tensorflow-pb文件)
  4. 【总结】那些只要发送口令就能获取的有三AI大包视频和图文资料,你都存下来了吗...
  5. 全球及中国拉丝润滑剂粉末行业投资潜力及发展战略规划报告2021-2027年
  6. 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
  7. eclipse中导入spring-boot框架的jar包方法
  8. PHP下实现两种ajax跨域的解决方案之jsonp
  9. 分享一个JDK1.8丢失数字精度的案例
  10. sysfs: cannot create duplicate filename '/class/spi_master/spi1'