Spring的Controller是Singleton的,或者是线程不安全的
和Struts一样,Spring的Controller是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建Controller,减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
这也是Webwork2吹嘘的地方,它的每个Action都是线程安全的。因为每过来一个request,它就创建一个Action对象。由于现代JDK垃圾收集功能的效率已经不成问题,所以这种创建完一个对象就扔掉的模式也得到了好多人的认可。Rod Johnson甚至以此为例证明J2EE提供的object pool功能是没多大价值的。
但是当人们在吹嘘线程安全怎么怎么重要的时候,我想请问有多少人在多少情况下需要考虑线程安全?Rod Johnson在分析EJB的时候也提出过其它问题,并不是没有了EJB的线程安全魔法,世界就会灭亡的,大多数情况下,我们根本不需要考虑线程安全的问题,也不考虑object pool。因为我们大多数情况下不需要保持instance状态。
至少我写了那么多的struts Action,写了那么多的Spring Controller,几乎没有碰到需要在instance变量保持状态的问题。当然也许是我写的代码不够多,Struts的设计者Craig R. McClanahan曾经说当时他设计struts时有两个条件不成熟:当时没有测试驱动开发的概念;当时JVM的垃圾收集性能太次。假如现在重新设计的话,他也会采用每个request生成一个新对象的设计方法,这样可以解决掉线程安全的问题了。
感言:
- 过度设计是魔鬼
- 设计是因地制宜的完全面向业务的设计,而不是什么都搭建一个鸟巢或者金字塔
- 现代社会,技术在进步,机器在进步,人的头脑也应该紧随其后,一些以前的问题,现在已经不是问题
- 简单,尽可能的简单(但不是简陋),这是一切一切的基础
分享到:
相关推荐
Synchronized锁在Spring事务管理下,导致线程不安全。
springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...
一个简单的spring的多线程demo,希望能对大家有用
假定两个Controller都在同一个工程中。 如果有比较合理的分层设计,这样的需求应该是非常...因为Controller B的实例中,Spring Boot为其进行配置和对象注入,这些准备工作不是简单通过实例化Controller B可以完成。
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
二、使用单例引起线程安全问题的例子 那究竟什么时候会用到呢?我相信大多数人写的代码都不会去考虑这个事情,用spring就认为只有单例,也只习惯用单例。但是有时候你想将代码写得更优雅一些的时候,你不得不去思考...
NULL 博文链接:https://ping2010.iteye.com/blog/2002064
原生Servlet与Spring Controller性能比较 Controller项目
springaop拦截controller日志
Maven项目,可直接编译...全spring配置,处理服务线程池线程数自定义; 上下文读取器配置添加至readerPool.readers; 上下文处理器配置添加至serviceProcessors.services; 分析链线程数配置serviceProcessors.threadCount;
原生Servlet与Spring Controller性能比较 博客中的 Servlet项目源码
Spring Mvc AOP通过注解方式拦截controller等实现日志管理
SpringMVC不能只使用@Controller而不使用@RequestMapping
springboot多线程范例,Spring Boot中使用多线程的方式有很多种,最简单的方式就是使用@Async注解来实现。
spring 多线程队列执行
NULL 博文链接:https://zkf60553.iteye.com/blog/1604723
NULL 博文链接:https://dave-2009.iteye.com/blog/769637
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
spring mvc controller间跳转 重定向 传参
SpringBatch是一个非常好的批处理是企业级业务系统,网上很多都是单进程的例子,我做了个多线程的读写数据库的例子。多线程有个问题就是数据安全性,那么加锁是解决这个问题的唯一方法,另外一个问题是对数据库里面...