我读过servlets中的代码可以与synchronized块同步。不过,我也读过,虽然通常只有一个servlet实例,但servlet容器可能会保留一个实例池。这肯定意味着一个同步块不能保证工作,因为你不知道请求线程会选择哪个实例?多个实例时的Servlet同步
回答
Servlet容器确实有一个用于处理请求的线程池,这意味着可能会有多个线程执行Servlet代码,这意味着访问任何共享的可变数据需要正确同步。
如果问题是如何使servlet的单线程的,则该方法之一是实现SingleThreadModel接口,但现在这已得到弃用。
http://docs.oracle.com/javaee/1.4/api/javax/servlet/SingleThreadModel.html
规范(3.0)的第2.2节说:
对于在分布式环境中(默认值)不举办一个servlet, servlet容器必须按servlet的使用只有一个实例 声明
所以,如果一个容器使用一个实例池,它违反了规范。我不明白为什么一个容器会这样做,因为每个servlet开发人员都知道多个线程可以同时访问这个servlet,因此这个servlet必须是线程安全的。
谢谢,这是我所期望的。我刚发现Tomcat实现了每个servlet的一个实例。要么我误解了信息,要么一些容器确实违反了规范。 – Jon 2011-12-31 12:04:50
也许你把“线程池”与“servlet实例池”混为一谈。 – 2011-12-31 12:07:16
- 1. 同步Greasemonkey脚本的多个实例
- 2. 使用多个实例同步两个定时器(Java)
- 3. 如何在tomcat上使用同一个servlet的多个实例
- 4. 跨多个映射的Servlet实例
- 5. 同步AzMan的两个不同实例
- 6. 在同一程序的多个实例之间同步
- 7. 同步MongoDB实例
- 8. JBoss 4.2.3如何实现SingleThreadModel(STM):一个servlet的实例或一个servlet的多个实例?
- 9. 同一异步任务的多个实例(Windows Phone)
- 10. 同步多个UITableView实例的滚动位置
- 11. 访问一个servlet实例
- 12. 同步Laravel雄辩实例
- 13. 同步Visual Studio实例
- 14. 如何同步不同的shell实例
- 15. 同步servlet会话
- 16. 同一个ResourceDictionary的多个实例
- 17. java在GAE环境中与多个JVM实例同步
- 18. 本地Postgres实例和Azure云Postgres实例之间的实时同步
- 19. 如何让同一数据库行的多个ActiveRecord实例保持同步?
- 20. 同时为多个用户同步ArrayList
- 21. servlet的每个实例与servlet中每个servlet的线程之间的区别?
- 22. 同一活动的多个实例
- 23. 同一选项的多个实例?
- 24. 创建多个相同的OCX实例
- 25. 同一活动的多个实例?
- 26. 实例化多个相同的对象
- 27. 实时同步跨多个设备的数据
- 28. 线程调用非同步实例方法时的同步方法被调用
- 29. Javascript - 不能实例化同一对象的多个实例
- 30. 是否有一个可以同步多个实例的jquery滚动条插件?
你在这里有什么问题? – milan 2011-12-31 11:15:23
我想你应该阅读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个答案的共识是每个servlet使用1个实例,所以同步将工作 – Jon 2011-12-31 11:59:07