Синхронизация 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