Как синхронизировать доступ к файлу в сервлете 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(){} Ключевое слово также не будет работать, так как я хочу синхронизировать доступ к файловой системе, а не доступ к переменным / объектам.

Итак, как можно синхронизировать доступ к файловой системе в моем сервлете, когда происходит несколько параллельных запросов к этому сервлету?

Ответы на вопрос(3)

Ваш ответ на вопрос