我已经读过servlet中的代码可以与synchronized块同步。但是,我还读过,虽然servlet容器中通常只有一个servlet实例可以保留一个实例池。当然这意味着同步块不能保证工作,因为您不知道请求线程将选择哪个实例?
答案 0 :(得分:3)
规范(3.0)第2.2节说:
对于未在分布式环境中托管的servlet(默认), servlet容器每个servlet只能使用一个实例 声明
因此,如果容器使用实例池,则违反规范。我不明白为什么容器会这样做,因为每个servlet开发人员都知道多个线程可以同时访问servlet,因此servlet必须是线程安全的。
答案 1 :(得分:1)
Servlet容器确实有一个用于处理请求的线程池,这意味着可能会有多个线程执行servlet代码,这意味着需要正确同步对任何共享可变数据的访问。
答案 2 :(得分:1)
如果问题是如何使servlet单线程化,那么其中一种方法是实现SingleThreadModel接口,但现在 已弃用 。
http://docs.oracle.com/javaee/1.4/api/javax/servlet/SingleThreadModel.html