不同JVM之间的Java同步

我正在研究的项目会触发各种异步工作来完成一些工作。 在我看来,这些异步作业实际上是作为单独的JVM(单独的Java进程)运行。 这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项:

  • 同步方法/块
  • 任何实现java.util.concurrent.locks

因为在我看来他们都是线程级的?

Java是否像流程之间的信号量一样为IPC提供支持?

那就对了。 您不能使用任何标准同步机制,因为它们在一个JVM中工作。

解决方案

  1. 您可以使用java 7中引入的文件锁。
  2. 您可以通过数据库实体使用同步。
  3. 像Terracota这样已经实施的解决方案之一可能会有所帮助
  4. 重新考虑你的设计。 如果您是Java世界的初学者,请尝试与经验丰富的工程师进行详细交谈。 你的问题表明恕我直言,你只是在错误的方式。

您可以使用synchronized关键字,锁,primefaces对象等 – 但它们是JVM的本地关键字。 因此,如果您有两个运行相同程序的JVM,它们仍然可以例如同时运行相同的synchronized方法 – 每个JVM上一个,但不是更多。

解决方案:

  • 兵马俑提供分布式锁定

  • 也是如此

  • 您可以在文件系统或数据库上使用手动同步

他们都是线程级别的?

这是正确的, synchronized等只能在单个进程的上下文中工作。

Java是否像流程之间的信号量一样为IPC提供支持?

在Java进程之间实现通信的一种方法是使用RMI 。

我已经使用文件实现了一个java IPC Lock实现: FileBasedLock和一个使用共享DB(jdbc)的DB2 Semaphore实现: JdbcSemaphore 。 这两个实现都是spf4j的一部分。

如果您有一个zookeeper实例,请查看Apache Curator中基于Zookeeper的Lock配方

我正在使用Redisson提供的分布式锁来同步不同JVM的工作