系列十四、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、加同步锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软考】系统集成项目管理工程师(九)项目成本管理【4分】

一、成本概念 1、产品全生命周期成本 产品或系统的整个使用生命周期内,在获得阶段(设计、生产、安装和测试等活动,即项目存续期间)、运营与维护、生命周期结束时对产品的处置所发生的全部成本 2、成本类型 成本类型描述可变成…

基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(二)板卡总体设计

2.2 板卡总体设计 本章开发了一款基于 AD7193RJ45 的多类型传感信号同步调理板卡,如图 2.4 所 示,负责将传感器传来的模拟电信号转化为数字信号,以供数据采集系统采集,实现了 单通道自由切换传感信号类型与同步采集多类型传…

在进行自动化测试,遇到验证码的问题,怎么办?

1.找开发去掉验证码或者使用万能验证码 2.使用OCR自动识别 使用OCR自动化识别,一般识别率不是太高,处理一般简单验证码还是没问题 这里使用的是Tesseract-OCR,下载地址:https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases 怎么使…

北邮22级信通院数电:Verilog-FPGA(7)第七周实验(1):带使能端的38译码器全加器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 关注作者的uu们可以进群啦~ 目录 方法一&#xff…

huoshan device_id和iid生成记录学习分析

huoshan 和 douyin 作为字节系的产品,device_id 和 iid是抓包经常遇到的字段,代表了设备的概念。 还是熟悉的接口,像 device_register ,app_alert_check 和 app_notice_status 都需要请求一遍。 这些接口跑完一遍,设…

信息科技风险管理:合规管理、技术防控与数字化

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 信息科技对金融业务发展所起的作用是举足轻重的。近年来&#xff0c…

什么是恶意代码?

前言:本文旨在分享交流技术,在这里对恶意代码进行全面的介绍和讲解 目录 一.什么是恶意代码 二.恶意代码的发展史 三.恶意代码的相关定义 四.恶意代码攻击机制 PE病毒 PE文件的格式 脚本病毒 脚本文件隐藏方法 宏病毒 浏览器恶意代码 U盘病毒 …

第13期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

p5.js map映射

本文简介 带尬猴,我嗨德育处主任 p5.js 为开发者提供了很多有用的方法,这些方法实现起来可能不难,但却非常实用,能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map() 方法。 什么是映射 从 p5.js 文档 中可…

Corel Products Keygen-X-FORCE 2023(Corel会声会影2023注册机)

Corel All Products Universal Keygens通用注册机是一款非常实用的激活工具,专门用于激活Corel全系列产品。尤其是被广泛使用的CorelDRAW作图软件和Corel VideoStudio会声会影视频编辑处理软件。小编也是一直关注由X-Force团队制作的注册机,目前已更新至…

接口自动化测试实操

实现思路 使用excel管理用例用例信息,requests模块发送http请求,实现了记录日志,邮件发送测试报告的功能 目录结构如下: 下面直接上代码: 统筹脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24…

2023/10/26MySQL学习

事务 询问当前是什么提交方式 1代表默认提交,0代表手动提交 将事务设为手动提交 将事务设置为手动提交后,mysql语句只会执行,但不会对原本表中数据进行更改, 只有执行以下两个语句之一,才会继续进行 commit完成原本操作,更改数据 rollback取消原来事务,不会进行任何更改 如…

foo = foo || bar 的深入解析

目录 前言 用法 代码示例 理解 注意点 结论 前言 在JavaScript中,foo foo || bar 是一种常见的编程模式,用于设置变量的默认值或者确保变量被赋值。这种写法利用了JavaScript中逻辑运算符的短路特性,即在逻辑运算中,一旦结…

HCL模拟器选路实验案例

此选路题目选自职业院校技能竞赛中的一道题比较考验思路,适合于参加新华三杯大赛以及网络专业的同学,当做练习题目进行解题​​​​​​​ 题目 1.S1、S2、R1、R2运行ospf进程100,区域0,R1、R2、R3、R4、R5运行ospf进程200&#…

LabVIEW在 XY Graph中选择一组点

LabVIEW在 XY Graph中选择一组点 问题:有一个包含许多点的XY Graph,在程序开发中,对于显示XY Graph中的多个点,如何进行选取。最好能像图像处理中的ROI一样,并且它们的颜色可以更改,可以在其中选择一些ROI…

基于机器视觉的车道线检测 计算机竞赛

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…

【API篇】六、Flink输出算子Sink

文章目录 1、输出到外部系统2、输出到文件3、输出到KafKa4、输出到MySQL(JDBC)5、自定义Sink输出 Flink做为数据处理引擎,要把最终处理好的数据写入外部存储,为外部系统或应用提供支持。与输入算子Source相对应的,输出…

VSCode远程连接

1 VSCode 远程连接服务器 1、下载vscode 百度搜索vscode(注意不是visual studio),进入vscode官网进行下载。 2、安装ssh插件 根据你的操作系统选择对应的版本进行下载和安装。 安装完成之后,启动vscode,选择左侧Exten…

记一次任意文件下载到Getshell

任意文件下载(Arbitrary File Download)是一种常见的 Web 攻击技术,用于窃取服务器上任意文件的内容。攻击者利用应用程序中的漏洞,通过构造恶意请求,使应用程序将任意文件(如配置文件、敏感数据等&#xf…

WebSocket—STOMP详解(官方原版)

WebSocket协议定义了两种类型的消息(文本和二进制),但其内容未作定义。该协议定义了一种机制,供客户端和服务器协商在WebSocket之上使用的子协议(即更高级别的消息传递协议),以定义各自可以发送…