不同JVM之间的Java同步

时间:2012-05-16 16:27:22

标签: java synchronization process

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

  • synchronized methods / blocks
  • 任何实现java.util.concurrent.locks
  • 的锁

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

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

5 个答案:

答案 0 :(得分:11)

没错。您不能使用任何标准同步机制,因为它们正在使用一个JVM。

解决方案

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

答案 1 :(得分:7)

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

解决方案:

  • 提供分布式锁定

  • 以及

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

答案 2 :(得分:0)

  

他们都是线程级的?

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

  

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

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

答案 3 :(得分:0)

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

如果您有一个zookeeper实例,请查看来自Apache Curator的基于Zookeeper的锁定配方

答案 4 :(得分:0)

我正在使用distributed lock提供的Redisson来同步不同JVM的工作