自学完SpringMVC之后,就产生了对于Spring中Bean的误解,此前我的理解是:单例模式,那每个controller同一时间不就只能处理一个请求。直到最近重新学习了JUC相关的内容,才搞明白单例模式不会影响多线程的调用,只是确保此类只有一个实例对象,明白这个之后才知道自己是被多么简单的问题给迷惑了。
接下来是我通过一个小demo,固化自己的理解。
这里懒得新建项目,就只在现有项目里添了几个测试方法。
通过当前controller(itemController)调用signalItem输出相关基本信息,并暂停10s
同时subscribeController调用signalSub输出线程名及itemController的地址,并且同时调用itemController的signalTest方法确保itemController可以正常调用
先向signalItem发请求,然后向signalSub发请求,可以得到如下结果:
通过结果不难看出,每次请求进来都会由一个线程来处理(这些线程通过tomcat的线程池维护)。并且两个请求的itemController是同一个对象,也就是说Spring的Bean是单例的。在controller对象没有处理完当前请求时,可以在另一个线程里处理其它请求,因为我们并没有对这个controller加锁。根本不会发生不能同时处理多个请求的情况。