服务器端代码中的线程安全性

时间:2012-05-03 07:34:39

标签: servlets thread-safety reentrancy

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

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

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

2 个答案:

答案 0 :(得分:0)

首先,每个请求都没有新的servlet。同一个独特的servlet实例将用于同时处理所有请求。 servlet也是一个单例:web容器只实例化一个实例。

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

如果没有看到你的单例的代码和JNI库的代码,它是否是线程安全的是不可能的。它是只读的这一事实表明它可以是线程安全的,但它不能保证。

答案 1 :(得分:0)

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

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