Spring 的常见业务组件采取单例如何保证线程安全

Spring 作为 IOC 框架,一般来说,Spring 管理的 controller、service、dao 都是单例存在,节省内存和 cpu、提高单机资源利用率(默认单例,配置多例模式使用 scope=prototype),既然是单例,那么如何控制单例被多个线程同时访问线程安全呢?

首先要理解每个 http 请求到后台都是一个单独的线程,线程之间共享同一个进程的内存、io、cpu 等资源,但线程栈是线程独有,线程之间不共享栈资源

其次,bean 分为有状态 bean 和无状态 bean,有状态 bean 即类定义了成员变量,可能被多个线程同时访问,则会出现线程安全问题;无状态 bean 每个线程访问不会产生线程安全问题,因为各个线程栈及方法栈资源都是独立的,不共享。即是,无状态 bean 可以在多线程环境下共享,有状态 bean 不能

Spring 的 dao、service 层使用的有状态 bean 如何保证线程安全

Spring 应用中 dao、service 一般以单例形式存在,dao、service 中使用的数据库 connection 以及 RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等都是有状态 bean,而 dao、service 又是单例,如何保证线程安全呢?

答案是使用 threadLocal 进行处理,ThreadLocal 是线程本地变量,每个线程拥有变量的一个独立副本,所以各个线程之间互不影响,保证了线程安全

SpringMVC 的 controller 并发访问

SpringMVC 中的 controller 默认是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常。所以如上所述,属性变量会到值线程安全问题,解决方法包括使用 threadLocal 或不使用属性变量、配置为多例均可(加锁控制效率不行)

Spring如何保证线程安全相关推荐

  1. MyBatis(六)SqlSessionTemplate是如何保证线程安全的

    前面说到DefaultSqlSession不是线程安全的,所以在MyBatis和spring项目整合的时候不能直接使用DefaultSqlSession,而是自己封装了一个线程安全的SqlSessio ...

  2. 面试官:AtomicInteger是如何保证线程安全?

    blog.csdn.net/nanhuaibeian/article/details/120936139 一.为什么引入 AtomicInteger ? 谈到线程安全,会首先想到了synchroniz ...

  3. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 222 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) JVM内存结构,是很 ...

  4. 聊聊保证线程安全的10个小技巧

    `` 前言 对于从事后端开发的同学来说,线程安全问题是我们每天都需要考虑的问题. 线程安全问题通俗的讲:主要是在多线程的环境下,不同线程同时读和写公共资源(临界资源),导致的数据异常问题. 比如:变量 ...

  5. 到底如何保证线程安全,总结得太好了。。

    一.线程安全等级 之前的博客中已有所提及"线程安全"问题,一般我们常说某某类是线程安全的,某某是非线程安全的.其实线程安全并不是一个"非黑即白"单项选择题. 按 ...

  6. 后端开发—10个小技巧教你保证线程安全

    前言 对于从事后端开发的同学来说,线程安全问题是我们每天都需要考虑的问题. 线程安全问题通俗的讲:主要是在多线程的环境下,不同线程同时读和写公共资源(临界资源),导致的数据异常问题. 比如:变量a=0 ...

  7. 你一定要知道的保证线程安全的10个小技巧

    导语 对于从事后端开发的同学来说,线程安全问题是我们每天都需要考虑的问题. 线程安全问题通俗的讲:主要是在多线程的环境下,不同线程同时读和写公共资源(临界资源),导致的数据异常问题. 比如:变量a=0 ...

  8. SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全

    2019独角兽企业重金招聘Python工程师标准>>> (1)下载地址:https://github.com/ccgus/fmdb (2)注意点 --语句可以带分号":&q ...

  9. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?

    欢迎关注方志朋的博客,回复"666"获面试宝典 阅读此篇文章,你需要有以下知识基础 Java内存模型,可见性问题 CAS HashMap底层原理 我们知道,在日常开发中使用的Has ...

  10. Java并发,volatile+不可变容器对象能保证线程安全么?!

    <Java并发编程实战>第3章原文 <Java并发编程实战>中3.4.2 示例:使用Volatile类型来发布不可变对象 在前面的UnsafeCachingFactorizer ...

最新文章

  1. kotlin + springboot 整合redis,Redis工具类编写及单元测试
  2. mysql5.5乱码问题_如何解决MySQL5.5的中文乱码问题
  3. 合肥市电力大数据应用工程技术研究中心成立
  4. 智能手环功能模块设计_基于STM32实现智能手环设计
  5. Linux学习日记:第二天
  6. nginx-1.13.x源码安装
  7. Install OpenCL on Debian, Ubuntu and Mint orderly
  8. linux mysql提示1045_linux mysql ERROR 1045
  9. mysql的存储引擎_Mysql数据库3种存储引擎有什么区别?
  10. 华为云优秀伙伴展示--2020-08-12
  11. MongDB之shard_主从,副本集,分片的理解
  12. Unity延迟和重复调用方法
  13. bundler for jekyll
  14. form表单的get和post传值问题
  15. html网页中获取vf数据到mysql_怎样从HTML网页中获取SQL数据库里的数据
  16. matlab仿真的五个步骤,matlab simulink 仿真步骤
  17. etc fstab 详解linux,Linux下/etc/fstab文件详解
  18. Matlab一张图上绘制两条曲线-2021-11-05
  19. sessionid java_java如何获取sessionid
  20. 地球物理勘探技术类毕业论文文献有哪些?

热门文章

  1. Java-微信公众号-上(环境搭建+基础回复功能)
  2. ThinkPad Win7更改鼠标滚轮设置问题
  3. 蚂蚁的开放:想办法摸到10米的篮筐 1
  4. 孕妇php是什么意思,孕妇适合念什么经
  5. postgresql数据库进行等保测评(审计) 需要修改的参数
  6. Pytorch之Optim(优化器)
  7. 微支付几个参数的获得
  8. c++ double 截取_C/C++ double取余函数
  9. PHP 之建行龙支付 - 被扫查单(商家扫码客户二维码),查询订单是否付款成功
  10. 微信小程序 添加分割线