当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 167867提问 提问时间:2023-10-27 22:31:10阅读次数: 67

最佳答案 问答题库678位专家为你答疑解惑

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

        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、加同步锁

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"系列十四、Spring如何处理线程安全问题":http://eshow365.cn/6-26365-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!