Servlet的线程安全问题

    Servlet 引擎采用多线程模式运行,它为并发的每个访问请求都预备一个独立的线程来进行响应。Servlet 引擎采用多线程模式可以提高访问性能,但也带来了线程安全问题。例如,如果并发的多个请求访问的是同一个 Servlet,那么将有多个线程来并发调用该 Servlet 的 service 方法。

 

    Servlet API 中定义了一个 javax.servlet.SingleThreadModel 接口,如果某个 Servlet 实现了 SingleThreadModel 接口,那么 Servlet 引擎将以单线程模式来调用其 service 方法。SingleThreadModel 接口中没有定义任何方法,只要在 Servlet 类的定义中增加实现 SingleThreadModel 接口的声明即可。对于实现了 SingleThreadModel 接口的 Servlet,Servlet 引擎将保证其单个实例对象的 service 方法不会同时被两个线程调用。但是,Servlet 引擎仍然支持对该 Servlet 的多线程并发访问,其采用的方式产生多个 Servlet 实例对象,并发的每个线程分别调用一个独立的 Servlet 实例对象,这样,可以同时有多个 Servlet 实例对象并发运行,但每一个 Servlet 实例对象的 service 方法都不会被多个线程并发调用。实现了 SingleThreadModel 接口的 Servlet 的多个实例对象共同组成了一个 Servlet 对象池,当Web容器接收到针对该 Servlet 的访问请求时,将从 Servlet 对象池中挑选一个空闲的 Servlet 实例对象进行响应。实现 SingleThreadModel 接口并不能真正解决 Servlet 线程安全问题,因为 Servlet 引擎会创建多个 Servlet 实例对象,多个并发的请求分别由不同的 Servlet 实例对象处理,或者被单个 Servlet 实例对象逐个依次排队处理,而真正意义上的多线程安全问题是指一个 Servlet 实例对象被多个线程同时调用的问题。所以,如果多个并发的 service 方法调用有线程安全的问题,最好是自己在 service 方法中编写多线程同步控制代码,而不要采用单线程的运行模式。事实上,在 Servlet API 2.4中,已经将 SingleThreadModel 标记为 Deprecated(过时的)。

 

哪些情况下要考虑线程安全问题?

    在 Servlet 程序中除了访问成员变量时要注意线程安全问题,访问其他共享资源时也应注意线程安全问题。例如,Web 应用程序对象,Session 对象,数据库等都可能涉及多个 Servlet 线程同时访问的问题。如果 Servlet 中没有定义成员变量和 service 方法中没有访问无同步访问控制的共享数据时,即使多个线程并发调用 service 方法,也不会存在任何线程安全问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值