浅析servlet线程安全性问题
前段时间去杭州面一家公司,提到了servlet线程安全性问题,由于我是应届生,经验不足,以前也没有考虑过这些东西,所以当时直接凭直觉在那么大一片空白处写上了一个连自己都发笑的synchornized,后来才发现,这个关键字也是得分点。哈哈,虽然后来谈薪水的时候被pass了, 但是我压根也没打算进去,主要是那家公司实力不强,而且办公环境超级不好。好了,说了这么的多废话,我就直接今天的笔记把。
servlet安全性问题,其实这在网上有很多资料供参考的,但是我还是要自己写一些东西,毕竟是自己在秋知道路上碰到的。
servlet默认是多线程的,它的生命周期是由Web容器负责的。当用户第一次请求某个servlet的时候,web容器先到web.xml文件中查找该servlet配置,然后找到servlet-class并实例化该servlet。而当当浏览器第二次请求该servlet的时候,web容器将不会再次实例化。即多个线程共同使用该servlet的实例。这就造成了一定的不安全因素,虽然这种不安全发生的概率不是很大,但是防范于未然是web开发中必须考虑到的。
下面为了突出servlet多线程在用户多次请求过程中突出的不安全性问题,给出一个例子。供参考。
synchronized(this){out = resp.getWriter();try {//让程序等待10秒钟后输出paramThread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}out.println("您传入的参数为:"+param+"<br>");}这种方法可以使用,但是不建议,毕竟同步会是系统的性能、吞吐量下降很多,而且还会造成多个用户的请求发生阻塞,相比来说,下面的办法更好。
避免使用实例变量,改为方法内的局部变量
简单的奖printwriter out = null,放在方法内定义即可。