2011-12-31 82 views
3

我读过servlets中的代码可以与synchronized块同步。不过,我也读过,虽然通常只有一个servlet实例,但servlet容器可能会保留一个实例池。这肯定意味着一个同步块不能保证工作,因为你不知道请求线程会选择哪个实例?多个实例时的Servlet同步

+0

你在这里有什么问题? – milan 2011-12-31 11:15:23

+2

我想你应该阅读BalusC的这两个答案:[Servlet如何工作?](http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading/ 3106909#3106909)和[Servlet的实例](http://stackoverflow.com/questions/2183974/difference-each-instance-of-servlet-and-each-thread-of-servlet-in-servlets/2184147#2184147) – 2011-12-31 11:20:18

+2

谢谢,从这2个答案的共识是每个servlet使用1个实例,所以同步将工作 – Jon 2011-12-31 11:59:07

回答

1

Servlet容器确实有一个用于处理请求的线程池,这意味着可能会有多个线程执行Servlet代码,这意味着访问任何共享的可变数据需要正确同步。

3

规范(3.0)的第2.2节说:

对于在分布式环境中(默认值)不举办一个servlet, servlet容器必须按servlet的使用只有一个实例 声明

所以,如果一个容器使用一个实例池,它违反了规范。我不明白为什么一个容器会这样做,因为每个servlet开发人员都知道多个线程可以同时访问这个servlet,因此这个servlet必须是线程安全的。

+0

谢谢,这是我所期望的。我刚发现Tomcat实现了每个servlet的一个实例。要么我误解了信息,要么一些容器确实违反了规范。 – Jon 2011-12-31 12:04:50

+1

也许你把“线程池”与“servlet实例池”混为一谈。 – 2011-12-31 12:07:16