java - 有关 Java Servlet 的详细线程安全问题

标签 java servlets thread-safety

我目前必须使特定的 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)已被弃用。

回应:

  1. 是的,这些是 doGet 和 doPost 等 HTTP 方法的参数,因此不需要同步对这些方法的访问。

  2. 正确,因为 getServletContext() 返回一个上下文级别对象,所有 servlet 和运行给定 servlet 的所有线程都可以访问该对象。

  3. 每个请求都带有自己的一组 cookie。同样,这是从方法参数 HttpServletRequest 获取的,因此访问不需要同步。

关于java - 有关 Java Servlet 的详细线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106283/

相关文章:

java - 如何使用java邮件从收件箱中读取10天前的邮件?

java - HttpSessionBindingListener 的 valueUnbound() 方法可用于在 session 即将被销毁时获取通知吗?

python - 将 SQLalchemy 与 gevent 一起使用是否安全?

java - Android 示例中的 tabhost 在模拟器中强制关闭

java - .exe jar 文件读取 txt 文件,但内容在不同的计算机上全部损坏(显示外星语言..)

java - 我的自定义 jsp 标记库抛出错误 HTTP Status 500 - 无法为 JSP 编译类

java - 释放锁后强制下一个线程的最短等待时间?

java - 什么时候在 JDBC 上使用批处理操作更快?

java - TCP_NODELAY 如何影响连续的 write() 调用?

c++ - 复制具有线程安全规则建议的非const参数的构造函数?