众所周知,spring boot是多线程的。
在开发中我们需要定义很多bean来实现不同的功能,这些bean被spring容器管理,默认情况下bean都是单例的。在多线程环境中使用单例的bean就不得不考虑线程安全问题。
关于如何保证线程安全有很多种方式:使用@Scope(value="prototype")注解,将bean变成多例,所有的线程都使用各自创建的bean(这当然是不太好的,每个线程都创建bean的话内存岂不是要被撑爆?)。还有就是可以给bean添加锁机制,保证多个线程在操作同一个bean时是串行的。
但是我们在使用spring boot开发的时候很少去给对象或函数加锁,这是为什么呢?这时就涉及到Javabean的两个概念:有状态bean与无状态bean。简单理解有状态bean就是在该bean创建的时候会携带一些特有的信息,这些信息会在程序执行时发生变动。而无状态bean就是在创建该bean时,他的状态就确定了,在后续的生命周期中不会发生变化。最简单的无状态bean就是没有任何字段的bean。spring boot中我们开发的controller、service、等基本上都是无状态bean。他们的特点是:只有方法,没有全局属性。我们定义的变量都在函数体内,这样的变量是每一个线程都会在自己的线程中创建不会共享的。所以这样的bean是线程安全的。
思考到这的时候联想到我们用的entity类。这种类肯定要定义全局属性的啊。然后我翻了翻我的代码发现,entity类是不会作为bean出现的,一般都是作为参数或局部变量的形式出现在代码中。
- 所以我们在开发的时候要注意:bean中尽量不要定义全局属性,如果非要定义也要保证该属性是final的。
以上都是个人理解,如有不对还请指教
参考:Spring 中的bean 是线程安全的吗? - myseries - 博客园 (cnblogs.com)