我最近阅读了一篇关于writing thread-safe servlets的文章,我了解到在doGet()
和doPost()
方法中使用servlet的成员字段是不安全的,因为它很可能是单一的servlet的实例使用两个线程处理两个单独的请求,这意味着成员变量是共享资源。我想知道我是否必须担心servlet依赖项的线程安全性。在我的应用程序设计中,servlet将对POJO服务处理程序进行服务调用,我正在考虑从Spring(使用ApplicationContext.getBean()
)注入一个依赖项。提前谢谢。
答案 0 :(得分:4)
是的,您也必须在POJO上担心它。它是一个成员变量。使服务线程安全。
答案 1 :(得分:2)
线程安全正是您拥有“请求”范围的原因。使线程安全的东西比它看起来要困难得多。但在常见的Web场景中,您可以将问题一直推到:
所以只是:
getBean()是线程安全的,所以只要你不将它们存储为servlet属性,你就可以只使用pojo服务并使用它们。
在这种情况下,您唯一的问题是:
生活在会话中的豆类可以变为不可变的(除非第2或第3点也适用)。通常可以跳过自定义缓存(在许多情况下,它们不会让事情变得更快 - 真的!除非你通过剖析证明它们有用,否则抛弃它们)。这给我们留下了3号:复杂的自定义应用程序逻辑。这个很棘手。
无论如何,由于这样的应用程序逻辑本质上很复杂,因此线程安全可能是我们最不担心的。