我创建了一个小型Java servlet,用于简单的目的:一旦被调用,它将执行以下步骤:
现在我面临的问题是,当两个或多个http请求同时调用servlet时,可能会发生问题。为了避免对同一文件进行多个并行写访问,我需要以某种方式同步此过程。从我对servlet生命周期过程的理解来看,每个请求都会生成一个新线程,因此使用FileLock可能没有任何影响:
“文件锁代表整个Java虚拟机进行持有。它们不适用于控制在同一虚拟机中由多个线程对文件的访问。”
(来自http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)
我猜想使用synchronized()关键字也不起作用,因为我想要同步文件系统访问而不是变量/对象的访问。
那么,在我的servlet上发生多个并行请求时,如何同步文件系统访问?
- 从本地文件系统中读取文件foo.json
- 处理文件中的数据并进行一些更改
- 将更改写回文件
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileInputStream inputStream = new FileInputStream("foo.json");
String filecontent = IOUtils.toString(inputStream);
inputStream.close();
JSONObject json = new JSONObject(filecontent);
doSomeChangesTo(json);
FileWriter writer = new FileWriter("foo.json");
writer.write(json.toJSONString());
writer.flush();
writer.close();
}
现在我面临的问题是,当两个或多个http请求同时调用servlet时,可能会发生问题。为了避免对同一文件进行多个并行写访问,我需要以某种方式同步此过程。从我对servlet生命周期过程的理解来看,每个请求都会生成一个新线程,因此使用FileLock可能没有任何影响:
“文件锁代表整个Java虚拟机进行持有。它们不适用于控制在同一虚拟机中由多个线程对文件的访问。”
(来自http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)
我猜想使用synchronized()关键字也不起作用,因为我想要同步文件系统访问而不是变量/对象的访问。
那么,在我的servlet上发生多个并行请求时,如何同步文件系统访问?
synchronized(){}
中,就可以了吗? - Timo Ernst