springboot单例模式注入对象_SpringBoot 单例Bean中实例变量线程安全研究-Go语言中文社区...

本文探讨了SpringBoot中单例模式的Bean存在的线程安全问题,如全局变量导致的问题,并提供了多种解决方案,包括使用AtomicInteger确保原子性、使用volatile关键字的限制、以及通过ThreadLocal实现线程隔离。此外,还提到了原型模式在多例场景下的应用作为另一种选择。
摘要由CSDN通过智能技术生成

首先,让我们弄清楚各种变量的区别: 成员变量、全局变量、实例变量、类变量、静态变量和局部变量的区别

Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,单例模式的意思就是只有一个实例当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题

一.单例模式有全局变量存在的问题

目前我们的系统中,Bean都是采取的单例模式,也就是在使用有 @Service 注解的类时都是采用 @Autowired。如果在 Bean 中 有全局变量,则由于该Bean 只有一个实例,当多用户访问统一接口时,Spring 采用多线程的方式去操作这个Bean ,这个全局变量也就可能存在线程不安问题。

1.1 线程不安全测试

Service

@Service

public class ConcService {

private int i;

public void add() {

i++;

}

public int getI() {

return i;

}

}

Controller

@RestController

@RequestMapping("conc")

public class ConcController {

@Autowired

private ConcService concService;

@GetMapping("/addi")

public void addI() {

concService.add();

}

@GetMapping("/geti")

public int getI() {

return concService.getI();

}

}

concService

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值