碰到一个面试题:Servlet线程是否安全?如果不安全怎样确保不会产生线程不安全问题?
仔细想了想,我给了这样的回答:
1 Servlet是线程不安全的。容器加载Servlet执行init()方法。
2 客户端产生请求时,容器实例化Servlet
3 请求结束,不会destroy() Servlet
4 第二个。。。请求时,直接执行 Service()方法
5 直至关闭容器destroy() Servlet
如果并发访问,怎样避免产生线程不安全问题?
1 同步synchronized 效率低下,不可取
2 避免定义全局变量,全部定义局部变量
解释:局部变量在方法体内部,实例化Servlet 并不会把方法放入堆中,而是放入方法区,每个类只保存一个,多个线程调用同一个方法。但是每个线程都有自己的栈空间,所有局部变量保存在线程的栈空间,不会产生冲突。
引申:struts1是单例多线程,每一个action会被多个线程访问,所以要注意线程安全。
struts2是多例多线程,每个请求线程都会产生一个action,不会造成线程安全。