starcite面试总结

写面试总结也是一件蛮意义的事情。尤其是经过这种3小时的超长面试。
因为我发现自己真的有太多不知道了。

关于servlet
“servlet里用到多少设计模式” – 我只知道template method,strategy
“servlet如何处理并发请求” – “Generally, the web container handles concurrent requests to the same servlet by concurrent execution of the service method on different threads.-Servlet Spec 2.4”
“servlet里有哪些方法“ – 基于http的请求类型,有doGet,doPost,doPut,doDelete,doHead(还应该有doOptions和doTrace
”servlet有几个实例“ – 一个。”For a servlet not hosted in a distributed environment(the default), the servlet container must use only one instance per servlet declaration. However, for a servlet implementing the SingleThrreadModel interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instances. – Servlet Spec 2.4″
”servlet什么时候被创建初始化“ – 容器会在servlet在被请求时初始化,或者通过配置在容器启动时创建并初始化。
”servlet的多线程问题“ – 默认情况下,容器会发送并发的请求给servlet的service方法。程序员必须在开发service方法时考虑到这个问题。或者使用SingleThreadModel接口来避免这样的情况出现。可以使用synchronized来控制request被依次处理,但是强烈不推荐(servlet spec2.4)
request和response的实现没有保证线程安全,如果被多线程访问到这些对象,则必须使用synchronized或者使用wrapper来确保线程安全。一个好的习惯是尽量使用局部变量中,因为多线程不共享局部变量。
参考深入研究Servlet线程安全性问题
简单的说,servlet因为是单个实例被多个线程运行,所以关键就在于线程共享数据存在线程安全问题,也就是对象变量是线程不安全的,局部变量是线程安全的。

httpsession的多线程问题
我得承认从来没有考虑过这个问题,spec上也是简单几句话。在网上找到这篇文章,谈到:

HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。

当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。

这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。

其他的一些参考:
HttpSession的线程安全问题及注意事项
Servlet及JSP中的多线程同步问题
Servlet的线程安全问题 – 比较详细的介绍线程的内存共享问题

hibernate N+1的问题,居然被问了3遍,唉,谁叫咱不记得呢。

Comments are closed.