繁体   English   中英

Servlet的线程安全问题

[英]Thread-safety issue for servlet

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

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

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

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

所以就:

  • 使您的dao无国籍,
  • 使您的服务变得无状态,
  • 如果您需要一些临时状态,请使用请求范围的bean。

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

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

  • 会话期间的豆类;
  • 自定义缓存;
  • 复杂的自定义应用程序逻辑;

可以将驻留在会话中的bean设为不可变的(除非第2点或第3点也适用)。 自定义缓存通常可以跳过(在许多情况下,它们无论如何都不会使事情变得更快-确实如此!除非您通过分析证明它们有用,否则将其丢弃)。 这给我们留下了3:复杂的自定义应用程序逻辑。 而且这很棘手。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM