Как синхронизировать доступ к файлу в сервлете Java?
Я создал небольшой Java-сервлет для простой цели: после его вызова он выполнит следующие шаги:
Прочитать файл 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-запросами к сервлету. Чтобы избежать множественного параллельного доступа для записи в один и тот же файл, мне нужно как-то синхронизировать это. Из моего понимания процесса жизненного цикла сервлета каждый запрос порождает новый поток, поэтому использование FileLock, вероятно, не окажет никакого влияния:
Блокировки файлов проводятся от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками в одной виртуальной машине.
(Отhttp://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)
Я думаю, что с помощьюsynchronized(){}
Ключевое слово также не будет работать, так как я хочу синхронизировать доступ к файловой системе, а не доступ к переменным / объектам.
Итак, как можно синхронизировать доступ к файловой системе в моем сервлете, когда происходит несколько параллельных запросов к этому сервлету?