问题遇到的现象和发生背景
spring框架在service层加上@service注解是单例模式, 两个线程同时调用单例模式service, 线程1的service的test方法返回1; 线程2的service的test方法返回2; 返回到controller的时候会不会拿到的都是2 ; 不会搞混吗?
spring框架在service层加上@service注解是单例模式, 两个线程同时调用单例模式service, 线程1的service的test方法返回1; 线程2的service的test方法返回2; 返回到controller的时候会不会拿到的都是2 ; 不会搞混吗?
为了说明问题,画个简单的JVM运行时数据区。
Spring框架在service层加上@Service注解是单例模式:注意:Spring默认是单例模式。
说明:下面的描述是在非线程安全的前提下做出的解释。
1、看上面的图,用注解@Service修饰的类,比如Test类,是单例的,也就是说,Controller层调用Test类,调用的是同一个对象。
2、重点来了,注意:方法test() 是在虚拟机栈里面运行的,当线程1调用方法test的时候,会在虚拟机栈里面开辟一个空间,线程2同理。
3、两个线程调用不同的空间,当然返回值也不同。
稍微扩展一下:在有线程安全的环境下:
假如线程1和线程2要操作相同的资源,或者凡是有线程安全问题存在,你提的问题就会发生。