servlet

servlet默认是多线程的,多线程并发处理多个用户的请求,servlet维护了一个线程池来服务多用户的请求.在servlet容器里有一个调度线程Dispatcher Thread和多个工作者线程Worker Thread,多个工作者线程实际上是在线程池中调度多个servlet,一个servlet只有一个实例.
要开发线程安全的servlet要注意几方面的线程安全问题.
1 变量的线程安全
变量线程不安全的原因就是可能被doGet方法的多个线程共享,值有可能被不确定的改变了。
解决方法:该为本地变量
同步doGet方法(不建议使用,严重影响性能)
在使用JDBC时候要注意不但要关闭连接还要将对象置空conn.close() conn=null这种情况是在使用线程池使用的,原因是其他线程有可能使用并关闭该连接,出现关闭异常。
2 属性的线程安全
ServletContext不是线程安全的
解决方案:同步或产生一个拷贝 或利用其他技术解决
HttpSession 不是线程安全的
打开多个同属于一个进程的浏览器窗口,访问session servlet会创建多个线程支持访问,所以在不同的窗口中访问session修改属性会发生异常
解决方法:同步session
ServletRequest是线程安全的
注意:不要在servlet 内创建线程,情况将会变得复杂难以预料
使用集合类时要使用同步的集合类
vector代替arraylist
hashtable代替hashmap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值