碰到一个面试题:Servlet线程是否安全?如果不安全怎样确保不会产生线程不安全问题?

仔细想了想,我给了这样的回答:

1 Servlet是线程不安全的。容器加载Servlet执行init()方法。

2 客户端产生请求时,容器实例化Servlet

3 请求结束,不会destroy() Servlet

4 第二个。。。请求时,直接执行 Service()方法

5 直至关闭容器destroy() Servlet

如果并发访问,怎样避免产生线程不安全问题?

1 同步synchronized 效率低下,不可取

2 避免定义全局变量,全部定义局部变量

解释:局部变量在方法体内部,实例化Servlet 并不会把方法放入堆中,而是放入方法区,每个类只保存一个,多个线程调用同一个方法。但是每个线程都有自己的栈空间,所有局部变量保存在线程的栈空间,不会产生冲突。


引申:struts1是单例多线程,每一个action会被多个线程访问,所以要注意线程安全。

struts2是多例多线程,每个请求线程都会产生一个action,不会造成线程安全。