查看原文
其他

第一次做面试官:说说Spring单例模式下Controller层为什么能多线程同时处理请求参数?

凤澜 云下风澜 2022-07-26

    就在今年的某一天,小编的领导突然告诉小编,咱们要招新人了,你去从这些简历里筛一下,去面试看看,有没有还不错的。

    然后就发现领导突然把小编拽进了一个群里,一封一封的简历把小编彻底淹没。。。。。

    就这样小编颤颤巍巍的把几封认为还不错的给到了HR。心想,这第一次面试别人,比自己面试还紧张,这要是面试者有啥问题问我,被问住了,那就只能尴尬的笑一笑吗 emo。


翌日


“你好呀,我是xx公司的面试官,感谢你参加我们本次的面试,请先做个自我介绍吧!”


“面试官你好,巴拉巴拉巴拉巴拉”。


中间省略一堆项目的介绍和提问。小编真的挺认真对待第一次当面试官的,只要是简历上写了,小编都问了,但是好像面试者不太开心。。。。。。。


下面我们直奔这篇文章的主题


---


"嗯,我看你项目经历还不错,那我们再聊一聊Java基础和常用框架吧,你可以先说一说Spring单例模式下Controller层为什么能多线程同时处理请求参数"


“嗯...... ,因为加锁了。”  面试者答道。


“加锁了...那在什么地方加锁了呢?具体体现在哪里?”


"嗯...... 这个我还不太了解,我回去再看看源码。你能给我点思路吗?"


其实面试到这里也快结束了,但是小编还是给面试者解释了一下这个问题。


像我们以前在不用spring的时候,写一个对外的接口,要先继承 **HttpServlet** 类,去重写doGet和doPost方法,tomcat会在接收到一个socket连接的时候,将其请求参数封装,并调用这个doGet或doPost钩子方法(这里我们只说这两种常用的,其他的PUT HEAD等方法这里不提了)。调用流程如下。



其中 FrameworkServlet.processRequest()方法会将你的入参放入到一个ThreadLocal里,这就解决了单例Controller在多线程下同时处理请求参数的问题。

因为ThreadLocal是线程独有的,在这里不会出现线程安全问题。


解释完这些后,小编很礼貌的和面试者说。


“我们今天的面试就先到这吧,我们会在本周内给你答复。”




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存