0

我是服务器端编码和 JSP/servlet 的新手。我有一个包含 3 个类的代码。第一个是从 java httpservlet 继承的 Serv 类。在这我实现了 doPost() 方法。在 doPost() 中,我使用第二类 ResourceClass 的对象。ResourceClass 是一个单例类。因此,基本上使用任何方法都是做类似 ResourceClass.getInstance().readResource(); 现在 readResource 进一步使用 Java Native 访问库从磁盘读取资源。现在我的问题是,因为据我了解,如果有 1000 个客户端针对每个新请求连接到我的服务器(Apache Tomcat),我将有一个新的 servlet 服务于该请求。但是所有这些 servlet 本质上都将使用相同的单例对象。因此,此读数将是线程安全的。

我不改变任何内部状态。所以我认为它不会影响我的输出,因此整个东西都是幂等的。但是所有这些请求是否都会排队,从而使单例类对象成为瓶颈。或者每个servlet都有自己的副本。

此外,如果我更改资源状态,那么在这种情况下它将是线程安全的。

4

2 回答 2

0

首先,您不会为每个请求创建一个新的 servlet。相同的、唯一的 servlet 实例将用于同时处理所有请求。servlet 也是一个单例:Web 容器只实例化一个实例。

您说对 ResourceClass 单例的请求将排队。他们不会,除非您将该方法标记为synchronized或使用其他一些锁定机制。如果你不这样做,那么线程将同时调用你的单例方法。

不看你的单例代码和JNI库的代码就无法判断它是否是线程安全的。它是只读的这一事实表明它可能是线程安全的,但不能保证。

于 2012-05-03T07:41:30.100 回答
0

在 Java EE 服务器中,每个 servlet 只有一个实例。另一方面,每个http请求都由服务器在自己的线程中处理。

有一个实例,ResourceClass因为它是单例,因此如果readResource()方法同步,您将遇到瓶颈。

于 2012-05-03T07:44:20.327 回答