这个servlet是线程安全的吗?

时间:2014-07-11 04:41:09

标签: java servlets thread-safety

我需要通过servlet调用提供一些文本。该文本是从多个复杂的数据库读取中获取的,因此我创建了一个文件来存储"呈现的#34;文本作为缓存的手段。如果文件存在且缓存不是旧的,则将用户重定向到该文件,这将花费很少的时间。否则,将重新创建该文件,然后用户也会重定向到该文件。

有经验的程序员会注意到这有明显的竞争条件。第一个解决方案尝试同步创建文件的块。但是,这仍然存在竞争条件。

第二个解决方案同步整个方法,而不是重定向到文件,它打印出方法中的文本。

protected synchronized void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

// if file doesnt exist, create file
// if cache is old, recreate file
// printout file
}

我的问题是:

  1. 这是线程安全的吗?我的意思是,servlet在解锁对象之前是否将所有数据发送到客户端?或者对象是否已解锁,然后servlet开始将结果发送给客户端?
  2. 表现受到严重影响。有没有其他方法可以提高性能,同时保持线程安全?
  3. 修改

    为了澄清,servlet通过调用另一个类中的静态方法来创建文件:Cache.createFile()。此方法仅由servlet访问。如果不是不可能的话,文件与任何其他外部应用程序的冲突是极不可能的。 createFile()始终写入同一文件。

2 个答案:

答案 0 :(得分:-1)

servlet是线程安全的..但是对于每个请求,都有新的线程分配给servlet类,在这种情况下,你有多个线程为多个servlet实例运行。现在它取决于你如何在你的方法中编写(代码),这可能会导致你在竞争条件下。

但是你用创造逻辑制作一些类似对象的单例。

答案 1 :(得分:-1)

由于Jigar joshi已经回答了你的问题。因此,您可以在此处实现单例模式以提高性能。在你的情况下,文件是一个资源,所以你必须同步它不完整的方法。 Ur代码shd看起来像

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

    if file doesnt exist OR cache is old
       synchronized(this){  // if instance method
          if file doesnt exist OR cache is old  // chk again to avoid re-generation of file
              create file 
       }
    }

    read file data OR printout file 
}