我为用户提供了编辑数据库中文件的选项。但是我不希望同时对同一个文件进行多次编辑,因此为了防止这种情况,我在服务器端使用了静态链接列表。当客户端将更新文件的请求发送到服务器时,LinkedList.contain(filename)将检查列表中是否存在文件名。如果它不存在,则将其添加并允许更新,否则它将仅在发生错误时返回响应。代码如下所示:

public class UpdateFileServlet extends HttpServlet{

    private static List<String> List= new LinkedList<String>();
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse res)
                    throws ServletException, IOException {
            String file=req.getHeader("FileName");
            if(List.contains(file)){
                res.getWriter().write("Error");
                res.flushBuffer();
                return;
            }
            List.add(file);
            try{
            //do the file update;

                List.remove(file);

            }catch (Exception e1) {
                List.remove(file);
                e1.printStackTrace();
            }
        }
    }
}


我还添加了try / catch,以便即使发生任何异常,也将从列表中删除文件名。否则文件将永远无法编辑。我知道这不是最好的方法,但是我想知道链表是​​否会出现故障,或者是否有更好的解决方案?

预先感谢您的任何帮助或建议...

最佳答案

几点。


LinkedList不是线程安全的。搜索时间也是线性的。您可能需要考虑ConcurrentHashMap。代替执行list.add()而是执行ConcurrentMap.putIfAbsent()并检查返回的值。
人们可能会通过不同的路径,例如绝对路径和相对路径均指向同一实际文件。因此,最好在保存结构中使用File对象而不是字符串。
我想无论更新是否成功,您都想执行list.remove(file)。因此,您需要将其放入finally块。

10-07 13:10
查看更多