gpt4 book ai didi

java - Servlet 中的线程安全和排队任务

转载 作者:行者123 更新时间:2023-11-30 06:30:43 25 4
gpt4 key购买 nike

我有几个问题。据我所知,对容器的每个请求都变成了一个HttpServletRequest。更多请求-> HttpServletRequest的更多实例。然后,当请求对象调用名为“abc”的 servlet 时,将创建“abc”servlet 的实例。假设同时有 3 个请求到达“abc”servlet,然后
(1) 我想知道,这是否意味着每个请求创建 3 个“abc”servlet 实例?或请求排队,直到完成对 servlet 的一个请求。

然后让我们说,3 对“abc”servlet 的请求执行一些可能是插入和检索的数据库进程同时。然后
(2) 一个请求是否应该在队列中,直到其他请求的 servelt 完成任务(同步)或所有 servelet 将它们的数据库任务作为多线程作为单独的任务(未同步)执行?
(3). 如果它们以不同步的方式工作,我们如何使这些任务同步(比方说,只有一个特定的任务——将一些东西保存到数据库)并排队?为此,实现 servlet SingleThreadModel 还是使用根据单例模式创建的类中的方法更好?那么它对容器的性能有什么影响呢?

简而言之,我们如何为所有请求同步运行特定任务?

我读了this以及。那篇文章说的是servlet。假设一个servlet的任务交给了另一个类,那么我想知道在这上面使用单例模式怎么样?

最佳答案

容器可以创建一个 servlet 实例池(下面的 servlet 规范摘录解释了详细信息)。它可以为三个并发请求使用三个不同的实例,或者可以为所有三个请求使用一个实例。因此,您的 servlet 需要是线程安全的,并且在它们的成员变量中不应该有状态。 SingleThreadModel 标记接口(interface)将向容器发出信号,不要对多个并发请求使用同一个 servlet 实例(从而使您的 servlet 线程安全),但它不会阻止容器创建多个实例并同时使用它们。说得通?如果您的操作需要同步,那么您可以在您的模型类中处理它,而不是您的 Controller 。所以基本上在其他地方同步(或排队)就是答案。让 servlet 接受命令并直接运行它,而不用在过程中考虑太多。

更新。针对您的情况(不是我喜欢它,只是为了说明这一点)的显式操作同步的一个非常基本的示例是让一个单例服务处理您的操作,其主要 do() 方法声明为同步。不过,理想情况下,您会将数据库并发委托(delegate)给您的数据库和持久层(事务、乐观并发)。

更正 根据 servlets spec :

In the default case of a servlet not implementing SingleThreadModel and not hosted in a
distributed environment, the servlet container must use only one instance of a servlet class
per servlet definition.
In the case of a servlet that implements the SingleThreadModel interface, the servlet
container may instantiate multiple instances of that servlet so that it can handle a heavy
request load while still serializing requests to a single instance.

话虽如此,除非您使用该单线程模型标记,否则您将只有一个 servlet 实例。

关于java - Servlet 中的线程安全和排队任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com