首先说结论,不是线程安全的~~
什么是有状态的Bean和无状态的Bean?
有状态的Bean:就是有全局、且有状态变量的Bean
无状态的Bean:没有全局变量的Bean,或者有全局但无状态变量
如果在多线程的情况下去操作有状态的单例Bean那么就会产生线程安全问题,若操作的是无状态的那么就不会产生线程安全问题
public class TestImpl implements Test{
// 这里就是两个有状态的变量,因为多线程情况下拿到的单例Bean虽然是同一个对象
// 但是同一个对象的属性不同,也会造成线程安全问题
private Integer age;
private User user;
public void testA() {
// ...
}
}
所以如何解决这种情况下的bean的线程安全问题呢?
- 通过开发人员去加锁控制,比如Synchronized、ReentrantLock等等
- 通过ThreadLocal保证每一个线程都有独立的变量值
@Component
// 假设这是一个实现类的Bean
public class TestImpl{
// 这里就是两个有状态的变量,因为多线程情况下拿到的单例Bean虽然是同一个对象
// 但是同一个对象的属性不同,也会造成线程安全问题
private User user;
public void testA() {
// ...
}
public void saveUser(User user) {
ThreadLocalUtils.save(user);
}
public Object getUser() {
return ThreadLocalUtils.get();
}
public void remove() {
ThreadLocalUtils.remove();
}
}
public class ThreadLocalUtils {
private static final ThreadLocal<Object> threadLocal = new ThreadLocal<>();
public static void save(Object o) {
threadLocal.set(o);
}
public static Object get() {
return threadLocal.get();
}
public static void remove() {
threadLocal.remove();
}
}
- 修改Spring的Bean的作用域为原型prototype,这样每次创建使用Bean的时候都是一个新的对象
创作不易,希望大家能够点个赞,也希望大家能帮忙指出问题,一起进步!!!谢谢大家~~