(面试题)Spring框架中的单例Bean是线程安全的吗?

171 阅读1分钟

结论:如果Bean有修改成员变量的方法就不是线程安全的,否则就线程安全

为什么

首先,需要搞清楚什么是单例Bean,就是全局默认一份,如果Bean有修改内部成员变量的方法,被多个线程同时修改,肯定是存在线程安全问题的。

所以,并发访问数据 + Spring对单例Bean没有并发处理 = 必定存在线程安全问题隐患

解决方案

(1)最简单的方式就是不使用单例模式,使用原型模式。每次请求获取的Bean都是一个全新的Bean,不存在并发访问也就是线程安全的

(2)ThreadLocal。比如数据库事务的实现方式,就是使用ThreadLocal,每个线程都有一份线程私有的Connection

(3)CAS、Synchronized、Lock保证线程同步