我需要通过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
}
我的问题是:
修改
为了澄清,servlet通过调用另一个类中的静态方法来创建文件:Cache.createFile()
。此方法仅由servlet访问。如果不是不可能的话,文件与任何其他外部应用程序的冲突是极不可能的。 createFile()
始终写入同一文件。
答案 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
}