Spring Bean 与线程安全

前两天在使用spring Bean的时候,发现跑出来的数据总是存在着一些奇怪的值,这些值在当前的处理当中本该不会出现,找了半天,发现时上一个线程使用该Bean后的遗留的值。后面查看了spring Bean的相关知识后,找到了问题的原因。 使用了ThreadLocal——线程本地变量的方式解决了问题。对问题产生的原因做一个分析和总结。
摘要由CSDN通过智能技术生成

    前两天在使用spring Bean的时候,发现跑出来的数据总是存在着一些奇怪的值,这些值在当前的处理当中本该不会出现,找了半天,发现时上一个线程使用该Bean后的遗留的值。后面查看了spring Bean的相关知识后,找到了问题的原因。 使用了ThreadLocal——线程本地变量的方式解决了问题。对问题产生的原因做一个分析和总结。

一. 问题原因

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

二. 使用ThreadLocal解决线程安全问题

    ThreadLocal和线程同步机制相比有什么优势呢?ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值