servlet的线程安全问题

时间:2011-02-08 14:38:42

标签: java servlets thread-safety

我最近阅读了一篇关于writing thread-safe servlets的文章,我了解到在doGet()doPost()方法中使用servlet的成员字段是不安全的,因为它很可能是单一的servlet的实例使用两个线程处理两个单独的请求,这意味着成员变量是共享资源。我想知道我是否必须担心servlet依赖项的线程安全性。在我的应用程序设计中,servlet将对POJO服务处理程序进行服务调用,我正在考虑从Spring(使用ApplicationContext.getBean())注入一个依赖项。提前谢谢。

2 个答案:

答案 0 :(得分:4)

是的,您也必须在POJO上担心它。它是一个成员变量。使服务线程安全。

答案 1 :(得分:2)

线程安全正是您拥有“请求”范围的原因。使线程安全的东西比它看起来要困难得多。但在常见的Web场景中,您可以将问题一直推到:

  • 数据库,免费提供原子性和线程安全性;
  • 无状态服务,根据定义,它是线程安全的(没有可以被破坏的状态)。

所以只是:

  • 让你的道歉无国籍,
  • 让您的服务无国籍,
  • 如果您需要一些临时状态,请使用请求范围的bean。

getBean()是线程安全的,所以只要你不将它们存储为servlet属性,你就可以只使用pojo服务并使用它们。

在这种情况下,您唯一的问题是:

  • 生活在会议中的豆子;
  • 自定义缓存;
  • 复杂的自定义应用程序逻辑;

生活在会话中的豆类可以变为不可变的(除非第2或第3点也适用)。通常可以跳过自定义缓存(在许多情况下,它们不会让事情变得更快 - 真的!除非你通过剖析证明它们有用,否则抛弃它们)。这给我们留下了3号:复杂的自定义应用程序逻辑。这个很棘手。

无论如何,由于这样的应用程序逻辑本质上很复杂,因此线程安全可能是我们最不担心的。