当前位置: 首页 > article >正文

系列十四、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.kler.cn/a/106248.html

相关文章:

  • 基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
  • 2023年第四届MathorCup大数据挑战赛(B题)|电商零售商家需求预测及库存优化问题|数学建模完整代码+建模过程全解全析
  • 【Linux】进程优先级|进程并发概念|在vim中批量化注释
  • ————python网络并发测试题————
  • 使用hibernate,报出ORA-00933_ SQL 命令未正确结束
  • 小程序如何设置自取规则
  • 容联七陌百度营销通BCP解决方案,让营销更精准
  • Git撤销已经push到远程分支的commit
  • Java BigInteger比Long更大的整数自增转字符串存储
  • “如何应用数据分析提升软件开发流程效率?”
  • 代码审计及示例
  • 离线电商数仓(三)
  • 算法通关村第三关-青铜挑战数组专题
  • Golang Websocket框架:实时通信的新选择
  • SLAM从入门到精通(lidar的运动畸变矫正)
  • 【springboot单元测试,集成测试】
  • FLStudio21完整版编曲软件多少钱?要不要购买
  • 【电路笔记】-电路中的复数与相量(Phasor)
  • uni-app配置微信开发者工具
  • Java练习题2021-4