похоже, это могло бы помочь
ценарий: у меня есть многопоточное Java-приложение, которое работает внутри контейнера сервлета. Приложение развертывается несколько раз внутри контейнера сервлета. На разных серверах работают несколько контейнеров сервлетов.
Возможно, этот график проясняет:
server1
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
server2
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
Внутри общего сетевого каталога есть файл, к которому могут обращаться все эти потоки. И они часто обращаются к файлу. В большинстве случаев файл читается только этими потоками. Но иногда это написано.
Мне нужно надежное решение для синхронизации всех этих потоков, чтобы гарантировать согласованность данных.Решения, которые не работают (правильно):
Использование java.nio.channels.FileLock
Я могу синхронизировать потоки с разных серверов, используя класс FileLock. Но это не работает для потоков внутри одного и того же процесса (контейнера сервлета), поскольку блокировки файлов доступны для всего процесса.
Использование отдельного файла для синхронизации
Я мог бы создать отдельный файл, который указывает, что процесс читает или записывает файл. Это решение работает для всех потоков, но имеет несколько недостатков:
Использование обмена сообщениями
Мы могли бы реализовать систему обмена сообщениями, которую потоки использовали бы для координации доступа к файлу. Но это кажется слишком сложным для этой проблемы. И снова: производительность будет плохой.
есть идеи?