系列十四、Spring如何处理线程安全问题

一、线程安全问题出现的原因

        Spring中出现线程安全的原因是,单实例bean中存在成员变量,并且有对这个bean进行读写的操作,因此出现了线程安全的问题。

二、案例代码

2.1、MySpringConfig

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/24 17:39* @Description:*/
@Configuration
@ComponentScan(basePackages = "org.star")
public class MySpringConfig {}

2.2、UserService

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/24 17:35* @Description: 演示单实例bean存在线程安全问题*/
@Service
public class UserService {private String username;public String welcome(String name) {username = "welcome " + name;try {// 休眠100毫秒:模拟处理业务耗时100毫秒Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}return username;}}

2.3、测试

public class Spring16MainApp {public static void main(String[] args) {existThreadSafe();}/*** 演示单实例bean存在线程安全问题*/private static void existThreadSafe() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);// 线程一UserService userService = context.getBean(UserService.class);new Thread(() -> {System.out.println(userService.welcome("张三"));}).start();// 线程二UserService userService2 = context.getBean(UserService.class);new Thread(() -> {System.out.println(userService2.welcome("李四"));}).start();}}

2.4、结果

实际结果跟预期结果不一致,出现了线程安全问题。

三、解决方式

3.1、将成员变量修改为局部变量

3.2、将bean改为多例的

3.3、将成员变量放到ThreadLocal中

3.4、加同步锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/152018.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】详解map和set基本接口及使用

文章目录 一、关联式容器与键值对1.1关联式容器(之前学的都是序列容器)1.2键值对pairmake_pair函数(map在插入的时候会很方便) 1.3树形结构的关联式容器 二、set2.1set的基本介绍2.1默认构造、迭代器区间构造、拷贝构造&#xff0…

Mysql数据库 4.SQL语言 DQL数据查询语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法:select 列名(字段名)/某几列/全部列 from 表名 [具体条件]; select colnumName…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一:基于LaTeX环境方案二:基于KaTeX(推荐) 方案三:基于Matplotlib写在最后 引言 近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

如何隐藏woocommerce 后台header,woocommerce-layout__header

如何隐藏woocommerce 后台header,woocommerce-layout__header WooCommerce |Products Store Activity| Inbox| Orders| Stock| Reviews| Notices| breadcrumbs 在 functions.php 里添加如下代码即可: // Disable WooCommerce Header in WordPress Admi…

C++数据结构X篇_21_插入排序(稳定的排序)

文章目录 1. 插入排序原理2. 算法图解3. 核心代码:4. 插入排序整体代码实现 1. 插入排序原理 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相…

matlab创建矩阵、理解三维矩阵

1.创建矩阵 全0矩阵:a zeros(2,3,4) 全1矩阵:a ones(2,3,4) !和python不一样的地方!此处相当于创建了4页2行3列的矩阵,而在python里是2页3行4列。 对第1页的第2行第3列元素进行修改:

【jenkins】centos7在线安装jenkins

一、系统要求 最低推荐配置 256MB可用内存 1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB) 软件配置 Java 8—​无论是Java运行时环境(JRE)还是Java开发工具包(JDK)都可以 二、安装jenkins 准备一台安装有ce…

Maven入门与开箱即用

一、初识 Maven(了解) 1、项目遇到的问题 构建:编译代码,运行测试,打包,部署应用,运行服务器等;依赖:项目依赖大量的第三方包,第三方包又依赖另外的包&…

windows 设置nginx、redis、jar包开机自启、mysql自动备份

1、--------------设置nginx------------------- cd到nginx 根目录与nginx.exe平齐 1.1下载WinSW.NET4.exe 放入nginx.exe平齐目录命名为nginx-servier.exe 链接: https://pan.baidu.com/s/1obKTinD1Z9BKgMJxZMtk2Q?pwdg47u 提取码: g47u 复制这段内容后打开百度网盘手机App…

Node.js中的单线程服务器

为了解决多线程服务器在高并发的I/O密集型应用中的不足,同时避免早期简单单线程服务器的性能障碍,Node.js采用了基于"事件循环"的非阻塞式单线程模型,实现了如下两个目标: (1)保证每个请求都可以…

JS问题:如何实现文本一键复制和长按复制功能?

前端功能问题系列文章,点击上方合集↑ 序言 大家好,我是大澈! 本文约2000字,整篇阅读大约需要4分钟。 本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。 …

面试准备中........

一、Linux 计算机网络相关: 1.OSI七层模型 应用层 :给用户提供操作界面 表示层:数据的表示:将字符转化为2进制或将2进制转化为字符。加密:对称加密和非对称加密,ssh协议。压缩:将文件压缩。…