我读到过在servlet中的代码可以通过同步块来实现同步。然而,我也读到过虽然servlet通常只有一个实例,但是servlet容器可能会保留一组实例。这是否意味着同步块不能保证有效工作,因为您不知道请求线程将选择哪个实例?
我读到过在servlet中的代码可以通过同步块来实现同步。然而,我也读到过虽然servlet通常只有一个实例,但是servlet容器可能会保留一组实例。这是否意味着同步块不能保证有效工作,因为您不知道请求线程将选择哪个实例?
规范(3.0)的第2.2节如下:
对于未托管在分布式环境中(默认情况下)的servlet, servlet容器必须仅使用每个servlet声明的一个实例
因此,如果容器使用实例池,则违反了规范。我不明白为什么容器会这样做,因为每个servlet开发人员都知道多个线程可能同时访问servlet,并且servlet必须是线程安全的。
Servlet容器拥有用于服务请求的线程池,这意味着可能会有多个线程执行servlet代码,因此对任何共享可变数据的访问都需要得到适当的同步。
http://docs.oracle.com/javaee/1.4/api/javax/servlet/SingleThreadModel.html