多个实例时的Servlet同步

3

我读到过在servlet中的代码可以通过同步块来实现同步。然而,我也读到过虽然servlet通常只有一个实例,但是servlet容器可能会保留一组实例。这是否意味着同步块不能保证有效工作,因为您不知道请求线程将选择哪个实例?


2
我认为你应该阅读BalusC的这两个答案:Servlets是如何工作的?Servlet的实例 - Mr.J4mes
2
谢谢,这两个答案的共识是每个servlet使用一个实例,这样同步就会起作用。 - Jon
3个回答

3

规范(3.0)的第2.2节如下:

对于未托管在分布式环境中(默认情况下)的servlet, servlet容器必须仅使用每个servlet声明的一个实例

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


谢谢,这正是我所期望的。我刚刚发现Tomcat实现了每个servlet的一个实例。要么我被误导了,要么一些容器确实违反了规范。 - Jon
1
也许你把“线程池”和“Servlet 实例池”混淆了。 - JB Nizet

1

Servlet容器拥有用于服务请求的线程池,这意味着可能会有多个线程执行servlet代码,因此对任何共享可变数据的访问都需要得到适当的同步。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接