我想知道在概念上,web请求与我可以在应用程序本身创建的线程有何不同?他们是否遇到与线程相同的问题(锁定,必须使状态对象成为线程安全的)
任何java-jackson(rest apis)应用程序中的各种HTTPRequest是否会自动由Web服务器同步?这些请求是否不像线程,并且可能会干扰处理这些Web请求的各种类的状态?或者,这是应用程序开发人员必须自己管理的东西吗?即他们确实需要同步或使这些杰克逊servlet线程安全吗?
由于
答案 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的并发请求 在不同线程上并发执行服务方法。