похоже, это могло бы помочь

ценарий: у меня есть многопоточное Java-приложение, которое работает внутри контейнера сервлета. Приложение развертывается несколько раз внутри контейнера сервлета. На разных серверах работают несколько контейнеров сервлетов.

Возможно, этот график проясняет:

server1
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2
server2
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2

Внутри общего сетевого каталога есть файл, к которому могут обращаться все эти потоки. И они часто обращаются к файлу. В большинстве случаев файл читается только этими потоками. Но иногда это написано.

Мне нужно надежное решение для синхронизации всех этих потоков, чтобы гарантировать согласованность данных.

Решения, которые не работают (правильно):

Использование java.nio.channels.FileLock
Я могу синхронизировать потоки с разных серверов, используя класс FileLock. Но это не работает для потоков внутри одного и того же процесса (контейнера сервлета), поскольку блокировки файлов доступны для всего процесса.

Использование отдельного файла для синхронизации
Я мог бы создать отдельный файл, который указывает, что процесс читает или записывает файл. Это решение работает для всех потоков, но имеет несколько недостатков:

Представление. Создание, удаление и проверка файлов являются довольно медленными операциями. Реализации с низким весом с одним файлом синхронизации предотвратят параллельное чтение файла.Файл синхронизации останется после сбоя JVM, что потребует ручной очистки.У нас уже были странные проблемы с удалением файлов в сетевых файловых системах.

Использование обмена сообщениями
Мы могли бы реализовать систему обмена сообщениями, которую потоки использовали бы для координации доступа к файлу. Но это кажется слишком сложным для этой проблемы. И снова: производительность будет плохой.

есть идеи?

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

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