我目前必须使特定的 Java servlet 实现成为线程安全的。 该代码不是我写的,我也没有参与它的设计或任何事情。我“只是”必须使其线程安全:)
我不是线程安全的初学者,但也不是专业人士。 Servlet 对我来说(或多或少)是全新的。我已经学习了一些教程并了解了有关 servlet 的基础知识,但仅此而已。我能找到的所有关于使 servlet 线程安全的教程都相当肤浅,而且我仍然有一些未解答的问题,我似乎无法找到答案。一些帮助将不胜感激。
1.) 据我了解,HttpServletRequests 和 HttpServletResponses 不在不同线程之间共享,因此我不需要同步对它们的读写访问(这是正确的吗?)。但是 HttpServletRequestWrappers 等呢?
2.) 我必须同步对 getServletContext() 返回的 ServletContext 对象的访问,特别是在我使用 setAttribute() 时,对吗?
3.) HttpServletRequests 有一个 getCookies() 方法。这些 Cookie 是否可能在不同请求之间共享,或者每个请求是否都有自己的 Cookie 对象(即使它们代表相同的“真实”cookie)?换个问法:我是否必须同步对返回的 cookie 对象的访问?
感谢您抽出时间阅读我的问题。我期待您的答复:)
最佳答案
Servlet 不是线程安全的,因为应用程序服务器可以维护 Servlet 的单个实例或实例池,并在多个传入请求之间共享它们。因此,servlet 不应该有任何状态(即 servlet 对象级变量不是线程安全的)。 Servlet 规范之前曾使用 SingleThreadModel
接口(interface)来强制给定的 servlet 是线程安全的,但我猜,从 2.3 开始,该接口(interface)已被弃用。
回应:
是的,这些是 doGet 和 doPost 等 HTTP 方法的参数,因此不需要同步对这些方法的访问。
正确,因为 getServletContext() 返回一个上下文级别对象,所有 servlet 和运行给定 servlet 的所有线程都可以访问该对象。
每个请求都带有自己的一组 cookie。同样,这是从方法参数 HttpServletRequest 获取的,因此访问不需要同步。
关于java - 有关 Java Servlet 的详细线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106283/