杰克逊网络servlet线程安全吗?

时间:2017-03-10 19:04:34

标签: java multithreading servlets concurrency jackson

我想知道在概念上,web请求与我可以在应用程序本身创建的线程有何不同?他们是否遇到与线程相同的问题(锁定,必须使状态对象成为线程安全的)

任何java-jackson(rest apis)应用程序中的各种HTTPRequest是否会自动由Web服务器同步?这些请求是否不像线程,并且可能会干扰处理这些Web请求的各种类的状态?或者,这是应用程序开发人员必须自己管理的东西吗?即他们确实需要同步或使这些杰克逊servlet线程安全吗?

由于

2 个答案:

答案 0 :(得分:1)

Servlet应该被编写为好像是单线程的。进入的每个HTTP请求都将在一个单独的线程中处理。

这意味着在servlet类中 no 共享可变状态。

如果您的servlet没有私有数据成员,并且所有操作都是对传入的参数或本地对象执行的,那么您就是线程安全的。无需同步。

共享状态必须是线程安全的。

答案 1 :(得分:1)

见: How are Threads allocated to handle Servlet request?

它没有在Servlet JSR中指定,但通常J2EE Web服务器使用一个线程来处理用户请求。

如此多的请求正在使用您的Servlet的一个实例=>许多线程正在使用你的Servlet的一个实例。

为了避免死锁或性能问题,请不要同步Servlet代码,使它们成为线程安全和无状态的:

请参阅: How do servlets work? Instantiation, sessions, shared variables and multithreading

JSR Servlet规范3.0 http://download.oracle.com/otndocs/jcp/servlet-3.0-fr-eval-oth-JSpec/

  

请求处理方法   基本的Servlet接口定义了一个用于处理客户端请求的服务方法。   为servlet容器路由到实例的每个请求调用此方法   一个servlet。   处理对Web应用程序的并发请求通常需要   Web Developer设计servlet,可以处理在其中执行的多个线程   特定时间的服务方法。   通常,Web容器处理对同一个servlet的并发请求   在不同线程上并发执行服务方法。