Синхронизация Java между различными JVM
Проект, над которым я работаю, будет запускать различные асинхронные задания для выполнения некоторой работы. Поскольку я рассматриваю это больше, эти асинхронные задания фактически выполняются как отдельные JVM (отдельные java-процессы). Означает ли это, что я не смогу использовать ни одно из следующего, если мне нужно синхронизировать между этими процессами:
- синхронизированные методы/блоки
- любой замок, который реализует
java.util.concurrent.locks
Потому что мне кажется, что они все на уровне потоков?
Поддерживает ли Java поддержку IPC, например, семафоров между процессами?
Ответы
Ответ 1
Это правильно. Вы не можете использовать какие-либо стандартные механизмы синхронизации, потому что они работают в одну JVM.
Решение
- Вы можете использовать блокировки файлов, введенные в java 7.
- Вы можете использовать синхронизацию через объекты базы данных.
- Один из уже реализованных решений, таких как Terracota, может быть полезен
- Передумайте свой дизайн. Если вы новичок в java мире, попробуйте подробно поговорить с более опытными инженерами. Ваш вопрос показывает, что ИМХО вы просто ошибаетесь.
Ответ 2
Вы можете использовать ключевое слово synchronized
, блокировки, атомные объекты и т.д., но они являются локальными для JVM. Поэтому, если у вас есть две JVM, запускающие одну и ту же программу, они все равно могут, например, одновременно запускать один и тот же метод synchronized
- по одному на каждом JVM, но не более.
Решения:
Ответ 3
все они на уровне нитей?
Правильно, synchronized
и т.д. работают только в контексте одного процесса.
Поддерживает ли Java поддержку IPC, например, семафоров между процессами?
Один из способов реализации связи между процессами Java - это RMI.
Ответ 4
Я реализовал реализацию java IPC Lock с использованием файлов: FileBasedLock и реализация IPC-семафора с использованием общего DB (jdbc): JdbcSemaphore. Обе реализации являются частью spf4j.
Если у вас есть экземпляр zookeeper, взгляните на рецепты Lock на основе Zookeeper из Apache Curator
Ответ 5
Я использую распределенный блокировка, предоставляемый Redisson для синхронизации работы различных JVM