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

news2024/11/16 7:30:32

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

        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.coloradmin.cn/o/1141194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

假脱机技术(SPOOLing技术)

文章目录 1.什么是脱机技术1.脱机技术解决的问题 2.假脱机技术的实现原理1.输入井和输出井2.输入进程和输出进程3,输入缓冲区和输出缓冲区 3.共享打印机的原理分析1.把独占式的打印机改造成共享设备 1.什么是脱机技术 脱机:脱离主机的控制进行的输入输出操作。 批处…

【1++的Linux】之进程间通信(共享内存)

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 我们在前面的文章中提到过,进程间的通信本质都是先看到同一块资源,然后通过这同一块资源进行通信,并且是单向的通信,只能一端发&#…

可视化 | (四)可视化降维

文章目录 📚降维的重要性📚MDS、PCA🐇MDS🐇PCA 📚SNE🐇总述🐇SNE🐇Symmetric-SNE🐇T-SNE 📚降维的重要性 降维在数据分析和可视化领域中扮演着重要的角色。当…

19、Python -- 关键字参数 与 参数默认值,参数收集 与 逆向参数收集

目录 关键字参数位置参数:关键字参数位置参数和关键字参数的混合使用关键字参数注意点 参数默认值使用参数默认值 普通参数收集(*xxx)注意点 关键字参数收集(**xxx)逆向参数收集注意点: dict(字典)的逆向参…

J2EE项目部署与发布(Windows版本)

目录 一.会议OA单体项目Windows部署 1.实操 二.spa前后端分离项目Windows部署 1.部署后端 2.部署前端 配置node.js 3.从实施的角度 4.从开发的角度 ​编辑 一.会议OA单体项目Windows部署 我们从实施的角度来看,拿到项目之后一定要问开发人员提供数据库脚…

SpringCloud复习:(8)Zuul内置过滤器

过滤器的执行顺序:根据filterOrder方法的返回值,返回值(包含负数)越小,越早执行 。 FilterProcessor类中会调用filter的runFilter方法 ZuulFilter中的runFilter方法会调用run方法:

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式

在做网络视频的时候,有些视频的编程概念,早点知道,早点弄清楚会少走很多的弯路。对应视频的转码,传输,一开始如果直接跟着代码跑的话,很容易觉得自己都明白了,但是为什么这样做,好像…

使用WebStorm创建和配置TypeScript项目

创建 这里我用的是WebStorm 2019.2.2版本 首先,创建一个空项目 File -> New -> Project->Empty Project生成配置文件 自动配置: 打开终端输入tsc --init,即可自动生成tsconfig.json文件 手动配置: 在项目根目录下新建一…

第四章 文件管理 八、文件保护

目录 一、口令保护 1、定义: 2、优点: 3、缺点: 二、加密保护 1、定义: 2、例子: 2、优点: 3、缺点: 三、访问控制 1、定义: 2、精简的访问控制表: (1)定义&a…

海南海口大型钢结构件3D扫描全尺寸三维测量平面度平行度检测-CASAIM中科广电

高精度三维扫描技术已经在大型工件制造领域发挥着重要作用,特别是在质量检测环节,高效、高精度,可以轻松实现全尺寸三维测量。本期,CASAIM要分享的应用是在大型钢结构件的关键部位尺寸及形位公差检测。 钢结构件,是将…

38 深度学习(二):tensorflow基础介绍

文章目录 tensorflow基础介绍基础张量自定义损失函数自定义模型和激活函数图函数(略)自动求导机制自定义fit tensorflow基础介绍 基础张量 import tensorflow as tf import numpy as np import pandas as pd# constant是常量张量 不能进行再次assign改…

【ETL工具】Datax-ETL-SqlServerToHDFS

🦄 个人主页——🎐个人主页 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油!&…

lazada获得lazada商品详情 API 返回值说明

item_get-获得lazada商品详情 lazada.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)获取key和secret接入secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_sear…

德思特新闻 | 走进德思特——通过创新帮助客户成功

文章来源:德思特测试测量 阅读原文:德思特新闻 | 走进德思特——通过创新帮助客户成功 走进德思特 2023年上半年,ChatGPT红遍全球,人工智能、B5G/6G、物联网、云计算、软件自动化等新兴技术的快速发展进一步推动科技行业的复苏…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 很喜欢‘万变不离其宗’这句话,希望在不断的思考和总结中找到Vue中的宗,来解答面试官抛出的…

gd32部分映射1/2,完全映射,备用功能选择等

一、重映射与部分映射问题 参考相应用户手册; 打开:I/O 重映射功能和调试配置; AFIO 端口配置寄存器 0(AFIO_PCF0); AFIO 端口配置寄存器 1(AFIO_PCF1); 【e.g】以定时器…

Java练习题2021-4

"某游戏公司设计了一个奖励活动,给N个用户(1≤N≤10^7)连续编号为1到N,依据用户的编号S发放奖励。 发放奖励规则为: 公司随机设定三个非零正整数x,y,z。 如果S同时是x、y的倍数,奖励2张卡片&#xff1…

QCI利用量子计算为飞行汽车提供优化飞行路径和改进设计的功能

​(图片来源:网络) 长期以来,飞行汽车和量子计算机一直是“未来技术”的简写,它们将彻底改变交通世界。预计到2032年,量子计算的市场价值将达到1700亿美元,当前有很多实际用例已经证明了它的价…

如何用 Zabbix 监控 Radius 服务?

网管小贾 / sysadm.cc Radius 对于搞系统的小伙伴们来说应该并不陌生,它是提供身份认证的服务程序。 Radius 应用广泛,最简单的场景之一就是无线连接,使用用户名密码或者证书等方式通过它的验证后无线网络连接就可以建立起来。 如此重要的一…

1496. 判断路径是否相交

1496. 判断路径是否相交 java代码&#xff1a; class Solution {public boolean isPathCrossing(String path) {int x 0;int y 0;HashSet<String> hashSet new HashSet<>();hashSet.add("0-0");for (int i 0; i < path.length(); i) {switch (pa…