- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
出于一个简单的目的,我创建了一个小型 Java servlet:调用它后,它将执行以下步骤:
代码的简化版本:
@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();
}
现在我面临的问题是,两个或多个对 servlet 的 http 请求几乎同时调用 servlet。为了避免对同一个文件进行多次并行写入访问,我需要以某种方式对其进行同步。根据我对 servlet 生命周期过程的理解,每个请求都会产生一个新线程,因此使用 FileLock 可能不会有任何影响:
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.
(来自http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)
我想使用 synchronized(){}
关键字也不起作用,因为我想同步文件系统访问而不是对变量/对象的访问。
那么,当多个并行请求发生在我的 servlet 上时,如何同步我的 servlet 中的文件系统访问?
最佳答案
I guess that using the
synchronized(){}
keyword would also not work since I want to synchronize file system access and not access to variables/objects.
使用synchronized
可以工作。您假设如果要控制多个线程对对象 X 的访问,则必须对该对象使用 synchronized
。你不知道。您可以对任何 对象使用synchronized
,前提是所有访问都使用相同的对象。
事实上,通常更好使用单独的private
锁对象进行同步,因为类外的代码不可能在锁上同步。
所以,您可能有这样的东西,每个共享文件都有一个实例:
public class SharedFile
{
private final File path;
private final Object lock = new Object();
public SharedFile(File path) {
this.path = path;
}
public void process(.....) throws IOException {
synchronized(lock) {
try(InputStream = new FileInputStream(path)) {
....
}
}
}
}
关于java - 如何在 Java servlet 中同步文件访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548192/
我是一名优秀的程序员,十分优秀!