Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。

Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为singleton的bean,在第一次被注入时,会创建为一个单例对象,该对象会一直被复用到应用结束。

  • singleton:默认的scope,每个scope为singleton的bean都会被定义为一个单例对象,该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建)。
  • prototype:bean被定义为在每次注入时都会创建一个新的对象。
  • request:bean被定义为在每个HTTP请求中创建一个单例对象,也就是说在单个请求中都会复用这一个单例对象。
  • session:bean被定义为在一个session的生命周期内创建一个单例对象。
  • application:bean被定义为在ServletContext的生命周期中复用一个单例对象。
  • websocket:bean被定义为在websocket的生命周期中复用一个单例对象。

我们交由Spring管理的大多数对象其实都是一些无状态的对象,这种不会因为多线程而导致状态被破坏的对象很适合Spring的默认scope,每个单例的无状态对象都是线程安全的(也可以说只要是无状态的对象,不管单例多例都是线程安全的,不过单例毕竟节省了不断创建对象与GC的开销)。

无状态的对象即是自身没有状态的对象,自然也就不会因为多个线程的交替调度而破坏自身状态导致线程安全问题。无状态对象包括我们经常使用的DO、DTO、VO这些只作为数据的实体模型的贫血对象,还有Service、DAO和Controller,这些对象并没有自己的状态,它们只是用来执行某些操作的。例如,每个DAO提供的函数都只是对数据库的CRUD,而且每个数据库Connection都作为函数的局部变量(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题),用完即关(或交还给连接池)。

有人可能会认为,我使用request作用域不就可以避免每个请求之间的安全问题了吗?这是完全错误的,因为Controller默认是单例的,一个HTTP请求是会被多个线程执行的,这就又回到了线程的安全问题。当然,你也可以把Controller的scope改成prototype,实际上Struts2就是这么做的,但有一点要注意,Spring MVC对请求的拦截粒度是基于每个方法的,而Struts2是基于每个类的,所以把Controller设为多例将会频繁的创建与回收对象,严重影响到了性能。

关注

感谢阅读,如果这篇文章帮助了您,欢迎 点赞收藏,关注转发 哟。您的帮助是我们前行的动力,我们会提供更多有价值的内容给大家... 谢谢!

controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......相关推荐

  1. controller如何保证当前只有一个线程执行_今天我们来聊一聊 Spring 中的线程安全性...

    优质文章,及时送达 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发 ...

  2. Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码

    原文地址:http://android.xsoftlab.net/training/multiple-threads/index.html 引言 大量的数据处理往往需要花费很长的时间,但如果将这些工作 ...

  3. c++ 等待子线程结束_?进程、线程、以及它们之间的区别与联系

    一.进程简介 1.1 进程概念的引入 计算机中,CPU是最宝贵的资源,为了提高CPU的利用率,引入了多道程序设计的概念.当内存中多个程序存在时,如果不对人们熟悉的"程序"的概念加以 ...

  4. java什么是线程安全_什么是线程安全?

    1.什么是线程安全? 线程安全概念:当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的. Java平台中,因为有内置锁的机制,每个对象 ...

  5. 引发线程安全的原因是什么?怎么解决?程序员一定要掌握的东西

    目录 前言 一.引发线程安全的原因 1.抢占式执行 2.多线程修改同一个变量 3.操作是原子的 4.指令重排序 5.内存的可见性问题 对于线程不安全问题,如何解决? Java的代码中如何进行加锁呢? ...

  6. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  7. java timer 线程安全_多线程之 线程安全与控制

    线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...

  8. java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

    java.线程池 线程数 此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因 ...

  9. java线程提交_从Java线程到线程池

    线程模型 线程模型分为两类,用户级线程(ULT)和内核级线程(KLT) 用户级线程(ULT):user level threads,系统内核对ULT无感知,线程的创建和调度都由用户级APP进程管理:即 ...

最新文章

  1. 如何在vsc上选择远程miniconda特定的虚拟环境中的Python解释器(4步)
  2. shell脚本自动记录登陆后 的IP地址和历史记录
  3. Overlay 网络 — Overview
  4. 安装虚拟机Ubuntu,搭建lnmp环境碰到的坑(二)
  5. pipreqs生成python项目依赖清单
  6. mysqldump导出数据库视图_mysql数据库的基本操作:索引、视图,导入和导出,备份和恢复...
  7. mysql用com_MySQL 使用教程
  8. excel表格从某个标志计算机,让Excel也玩多标签 多个图表一个窗口 -电脑资料
  9. python redis 消息队列_Python的Flask框架应用调用Redis队列数据的方法
  10. 适配接口 java_【Java 设计模式】接口型模式--Adapter(适配器)模式
  11. Spring JdbcTemplate示例
  12. Java高并发BlockingQueue重要的实现类
  13. Asp.Net MVC学习总结(三)——过滤器你怎么看?
  14. 三元运算符最终结果的数据类型
  15. vs2012安装VA插件
  16. 微软服务器系统版本有几个,windows系统有几个版本
  17. 读书笔记 - 《斯坦福极简经济学》
  18. java判断excel格式_Java 设置Excel数据验证
  19. google浏览器字体模糊问题(类似分辨率问题)解决办法
  20. 小米助手android6版本暂未支持,小米助手连接不上小米5怎么办 小米助手显示不支持安卓6.0连接不上小米5解决方法...

热门文章

  1. 2019 ICPC Asia Nanchang Regional And and Pair 组合数学
  2. NEC Programming Contest 2021 (AtCoder Beginner Contest 229)
  3. [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程
  4. CF1612G Max Sum Array
  5. CF1037H Security(SAM)
  6. 洛谷P3791:普通数学题(整除分块、前缀和)
  7. 2021CSP:游记
  8. CF525D-Arthur and Walls【贪心】
  9. P2217-[HAOI2007]分割矩阵【dfs,记忆化搜索】
  10. ssl1776-游乐场【图论,深搜】